AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Interbase StoredProc anlegen. Fehlermeldung
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase StoredProc anlegen. Fehlermeldung

Ein Thema von Sven Janssen · begonnen am 21. Aug 2006 · letzter Beitrag vom 22. Aug 2006
Antwort Antwort
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#1

Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 16:06
Datenbank: Interbase • Version: 6 • Zugriff über: IBConsole
Hallo,

ich wollte folgende StoredProc in der IBConsole anlegen:
SQL-Code:
SET TERM ^;
create procedure nextFreeLiefNumber ( lBound char(7), uBound char(7))
    returns (A_RETURN INTEGER) AS
begin
    SELECT o.L1_NR as freienummer FROM FLIEF_1 o where o.L1_nr between lBound and uBound
        AND NOT EXISTS (SELECT i.L1_NR FROM FLIEF_1 i
            WHERE cast(i.L1_NR as double precision) = cast(o.L1_NR as double precision) + cast(1 as double precision));
    A_RETURN = cast(freienummer as double precision)+1;
end
SET TERM ;^
Allerdings ergibt das den Fehler
Zitat:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 6, char 117
;
Entferne ich das ; erhalte ich den Fehler
Zitat:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 7, char 3
A_RETURN
Die select Anweisung alleine funktioniert tadellos.
Irgendwas übersehe ich ... wäre nett, wenn mir jemand auf die Sprünge helfen kann.
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 16:23
SQL-Code:
SET TERM ^;
create procedure nextFreeLiefNumber ( lBound char(7), uBound char(7))
    returns (A_RETURN INTEGER) AS
declare freienummer double;
begin
  For
    SELECT o.L1_NR as freienummer FROM FLIEF_1 o where o.L1_nr between lBound and uBound
        AND NOT EXISTS (SELECT i.L1_NR FROM FLIEF_1 i
            WHERE cast(i.L1_NR as double precision) = cast(o.L1_NR as double precision) + cast(1 as double precision)) into :freienummer do
    A_RETURN = cast(freienummer as double precision)+1;
    suspend;
end
SET TERM ;^
getiipt und nicht getestet.
Markus Kinzler
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 16:28
Wenn ich es richtig sehe, musst Du das SELECT-Ergebnis in eine Variable speichern, damit Du es für den Rückgabewert verwenden kannst; und das fehlt (ich habe die Prozedur entsprechend geändert):
Zitat von Sven Janssen:
SQL-Code:
SET TERM ^;
create procedure nextFreeLiefNumber ( lBound char(7), uBound char(7))
    returns (A_RETURN INTEGER)
AS
  CREATE VARIABLE freienummer INTEGER; /*  den richtigen Typ musst Du eintragen  */
begin
    SELECT o.L1_NR FROM FLIEF_1 o where o.L1_nr between lBound and uBound
        AND NOT EXISTS (SELECT i.L1_NR FROM FLIEF_1 i
             WHERE cast(i.L1_NR as double precision) = cast(o.L1_NR as double precision)
                                                     + cast(1 as double precision))
      INTO :freienummer;
    A_RETURN = cast(freienummer as double precision)+1;
    SUSPEND; /*  das fehlte außerdem, wie mkinzler anmerkte  */
end
SET TERM ;^
Die Fehlermeldungen verwirren, weil IB nach dem Ende des SELECT-Befehls noch etwas erwartet, nämlich INTO.

Du musst aber aufpassen, dass dieser SELECT wirklich immer nur einen Wert liefert; andernfalls erhältst Du zur Laufzeit eine neue unerklärliche Fehlermeldung.

War's das? Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#4

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 16:30
Ah interessant. Syntax mal wieder ganz anders wie unter Informix.
Allerdings funktioniert es nicht. Zuerst musste ich ein VARIABLE hinter DECLARE setzen und dann läuft es nicht durch
Zitat:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 13, char -1
SET
Liegt am letzen SET. Entferne ich das meckert er über die Spalte lBound. Aber warum Spalte? ISt doch eine Variable.

@Jürgen
Gleiches Problem wie oben
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 16:35
Hi,

Du solltest die SP auch abschließen!

SQL-Code:
SET TERM ^;
...
    SUSPEND; /*  das fehlte außerdem, wie mkinzler anmerkte  */
end^
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#6

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 16:47
Ach ja, wir haben alle übersehen, dass die Variablen und Input-/Output-Parameter mit einem Doppelpunkt versehen werden müssen, damit sie von den Spalten unterschieden werden können:
SQL-Code:
SET TERM ^;
create procedure nextFreeLiefNumber ( lBound char(7), uBound char(7))
    returns (A_RETURN INTEGER)
AS
  CREATE VARIABLE freienummer INTEGER; /*  den richtigen Typ musst Du eintragen  */
begin
    SELECT o.L1_NR FROM FLIEF_1 o where o.L1_nr between :lBound and :uBound /*  hier 2 Mal!!!  */
        AND NOT EXISTS (SELECT i.L1_NR FROM FLIEF_1 i
             WHERE cast(i.L1_NR as double precision) = cast(o.L1_NR as double precision)
                                                     + cast(1 as double precision))
      INTO :freienummer;
    A_RETURN = cast(freienummer as double precision)+1;
    SUSPEND; /*  das fehlte außerdem, wie mkinzler anmerkte  */
end^
SET TERM ;^
Bitte genau durchlesen. An anderen Stellen (z.B. bei der Zuweisung A_Return =...) ist IB nicht so pingelig; aber innerhalb von Select/Insert/Update/Delete muss es sehr genau sein.

Jürgen

[/edit]Nachtrag
Bitte prüfe auch noch die Datentypen:

1. Ich sehe keinen Grund, warum Du LI_NR und freienummer per cast() zu einem double precision machst. Wenn alles INTEGER sind, kannst Du auf cast verzichten.
2. Bei 'Erweiterung' eines Datentyps (von integer zu double) kann auf cast verzichtet werden; das macht IB selbst. Umgekehrt ist es nötig.
3. Da ich annehme, dass das Feld LI_NR integer ist, bietet es sich an, auch die Input-Parameter als integer statt char(7) zu deklarieren.

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#7

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 21. Aug 2006, 17:15
Ok danke. Ich werde das direkt morgen früh testen.
Sind meine ersten Schritte mit SQL und Interbase. Zuvor nur rudimentär mit Informix und TQuery auf Paradox.
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#8

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 22. Aug 2006, 08:01
Gute Morgen,

So das ganze hat funktioniert. Danke noch einmal.
L1_nr ist char. Es ist eine Lieferantennummer die maximal 7 Stellen besitzt und alphanummerisch ist. Die automatisch vergebenen Nummern sind aber nummerisch. Der Kunde kann selber einstellen wieviele Stellen die Nummer haben kann. Also z.b 000-999 oder 0000-9999.

Sven
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#9

Re: Interbase StoredProc anlegen. Fehlermeldung

  Alt 22. Aug 2006, 10:31
----- hat sich erledigt
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz