PDA

View Full Version : Aufruf einer SQL Prozedur mit OUT-Parameter erzeugt Parameter-Fehler



msost
06-01-23, 16:41
Moin,

ich möchte eine einfache SQL-Prozedur mit zwei IN- und einem OUT- Parameter aufrufen. Dabei erhalte ich immer den Fehler "number of Parameter values set or registered does not match number of parameters". Es erscheint mir als wenn der Parameter-Marker (?) im Aufruf nicht erkannt wird. Was kann die Ursache sein?

Erstellen der Prozedur:

CREATE or replace PROCEDURE Bibliothek.test (
IN inANR numeric(6, 0),
IN inANR numeric(6, 0),
OUT outM numeric(10,3)
)
LANGUAGE SQL
SPECIFIC Bibliothek.test
...

Aufruf im ACS Run-SQL-Script-Tool:

call Bibliothek.test(000100, 500, ?);

B.Hauser
07-01-23, 11:02
Versuch mal vor dem Komma (Trennzeichen) ein Blank einzufügen.
Außerdem solltest Du bei gepackten und gezonten Werten tatsächlich ein Dezimal-Trennzeichen angeben. Numerische Werte ohne Dezimal-Trennzeichen werden als Integer definiert, was für SQL ein anderer Datentyp ist.

Also so:

CALL Bibliothek.test(000100,0 , 500,0 , ? );

ACS stellt sich da manchmal ein bisschen doof an!
Wenn kein Blank vor dem Trennzeichen angegeben ist, wird das Komma als Trennzeichen interpretiert und der nächste Parameter als Nachkomma-Stellen ... und damit erkennt er nur 2 und keine 3 Parameter

Andreas_Prouza
08-01-23, 07:07
Ich meine beim ACS gibst du statt dem ? einfach einen Dummy-Wert an:

call Bibliothek.test(000100, 500, 0);

Unabhängig davon würde ich auch noch prüfen ob SQL nicht mehrere Prozedurend davon erstellt hat.
Z.B.: test00001 usw.
Der OR REPLACE bei den Prozeduren erstetzt nicht immer die Prozedur, gerade wenn sich die Parameter ändern, da SQL dann meint, dass es sich um eine ganz eigene Prozedur mit gleichen Namen aber unterschiedliche Parameter handelt.
Im ACS über das Menü "Schemas" einfach kurz prüfen.

lg Andreas

Fuerchau
08-01-23, 11:29
Um eine Prozedur mit Ausgabeparameter zu testen, bedarf es einer Hilfsfunktion, die den Ausgabeparameter als Return liefert. Diese ist dann im Select verwendbar.

Ein "?" gilt als Parameter, den man natürlich per ACS-SQL nicht übergeben kann.
Ein typgerechter Ersatzwert hilft ja nur beim Debug.
Typgerecht heißt: ein 10,3-Wert muss als 1234567,890 übergeben werden.
Wobei dies allerdings zu einem decimal (also packed) und nicht numeric (zoned) führt.

B.Hauser
08-01-23, 13:14
Bevor man irgendetwas behauptet sollte man es zuerst testen!
... oder aber einfach mal ausprobieren, was andere empfehlen!

647

Fuerchau
08-01-23, 14:45
Das zeigt mal wieder, dass eine kleine Provokation meinerseits dazu führt, dass mir das Gegenteil bewiesen wird. Und vor allem wie genau es gemacht wird.
Somit hilft dies dann doch allen.
Vielen Dank dafür.

msost
09-01-23, 08:47
@Brgitta: Danke, das blank hat geholfen.
@Andreas: Danke für den Hinweis auf ggf. mehrfach erstellte Prozeduren (was ja, wenn man verschiedene Versionen unterstützen möchte, auch sinnvoll sein kann). Hatte ich aber mit der Angabe von SPECIFIC schon vermieden.