Anmelden

View Full Version : Externe Stored Procedure



Seiten : [1] 2

Allrounder
04-04-08, 14:11
Beim Versuch, ein CLP über eine Externe Stored Procedure aufzurufen, bekomme ich den Fehler:



SQL-Status: 42884
Vendorencode: -440
Nachricht: [SQL0440] Routine MYCLP in MYLIB mit angegebenen Parametern nicht gefunden. Ursache . . . . : Eine Funktion oder Prozedur mit dem angegebenen Namen und verträglichen Argumenten wurde nicht gefunden. Fehlerbeseitigung: In der Anweisung CALL oder im Funktionsaufruf die korrekte Anzahl und Art der Parameter angeben. Die Anforderung wiederholen.


Die Parameter des CLPs:


DCL VAR(&PARM1) TYPE(*DEC) LEN(6 0)
DCL VAR(&PARM2) TYPE(*DEC) LEN(7 0)


Die Stored Procedure lautet:


CREATE PROCEDURE MYLIB.TEST (
IN PARM1 DECIMAL(6, 0) ,
IN PARM2 DECIMAL(7, 0) )
LANGUAGE CL
SPECIFIC MYLIB.TEST
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME 'MYLIB/MYCLP'
PARAMETER STYLE SQL ;


Aufruf aus SQL:


call mylib.test(123456, 1234567)

Wo ist der Fehler? Wie muss ich die Parameter definieren, dass es funktioniert?

TARASIK
04-04-08, 14:48
Hallo,
läuft auf der ISeries das Release R530 ?

Allrounder
04-04-08, 16:03
Nein, V5R4M0. (Das Forum will min. 20 Zeichen, jetzt müsste es passen)

BenderD
04-04-08, 17:31
ich tippe mal auf Seiteneffekt des überladens (SQL erlaubt mehrere gleichnamige Procedures mit unterschiedlichen Parameterschnittstellen) versuchs mal mit einem Cast der Parameter beim Aufruf

D*B


Beim Versuch, ein CLP über eine Externe Stored Procedure aufzurufen, bekomme ich den Fehler:



SQL-Status: 42884
Vendorencode: -440
Nachricht: [SQL0440] Routine MYCLP in MYLIB mit angegebenen Parametern nicht gefunden. Ursache . . . . : Eine Funktion oder Prozedur mit dem angegebenen Namen und verträglichen Argumenten wurde nicht gefunden. Fehlerbeseitigung: In der Anweisung CALL oder im Funktionsaufruf die korrekte Anzahl und Art der Parameter angeben. Die Anforderung wiederholen.


Die Parameter des CLPs:


DCL VAR(&PARM1) TYPE(*DEC) LEN(6 0)
DCL VAR(&PARM2) TYPE(*DEC) LEN(7 0)


Die Stored Procedure lautet:


CREATE PROCEDURE MYLIB.TEST (
IN PARM1 DECIMAL(6, 0) ,
IN PARM2 DECIMAL(7, 0) )
LANGUAGE CL
SPECIFIC MYLIB.TEST
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME 'MYLIB/MYCLP'
PARAMETER STYLE SQL ;


Aufruf aus SQL:


call mylib.test(123456, 1234567)

Wo ist der Fehler? Wie muss ich die Parameter definieren, dass es funktioniert?

B.Hauser
04-04-08, 17:38
Hallo,

gib die Parameter beim Aufruf mal mit ,0 an.
Werden numerische Werte ohne Dezimal-Stellen in SQL verwendet, werden diese als Integer und nicht als Dezimal interpretiert.

Da in SQL Funktionen und Prozeduren überladen werden können, wird eine Prozedur mit Integer-Parametern gesucht. (Obwohl das nicht das eigentliche Problem sein kann, da Stored Procedures nur aufgrund der Anzahl der Parameter überladen werden können.)

Außderdem würde ich Parameter-Style General (anstatt SQL) verwenden. Bei General werden nur die Parameter, so wie sie definiert sind übergeben. Bei Parameter Style General werden beim Aufruf der Stored Procedure noch zusätzliche Parameter z.B. Indikator-Variablen für NULL-Werte oder der SQL-Status übergeben.

Birgitta

Fuerchau
04-04-08, 18:35
Ggf. ist auch explizites casten erforderlich:

call mylib.test(dec(123456, 6, 0), dec(1234567, 7, 0) )

B.Hauser
04-04-08, 19:38
Hallo,

ich habe gerade eben eine einfaches CL-Programm erstellt, das 2 numerische Werte erwartet und dieses wie folgt als Stored Procedure registriert:



CREATE PROCEDURE MYSCHEMA.HSCLPROC (
IN PARM1 DECIMAL(7, 0),
IN PARM2 DECIMAL(6, 0))
LANGUAGE CL
SPECIFIC MYSCHEMA.HSCLPROC
DETERMINISTIC
NO SQL
CALLED ON NULL INPUT
EXTERNAL NAME 'MYSCHEMA/HSCLPROC'
PARAMETER STYLE GENERAL;


und wie folgt ohne Probleme aufgerufen:


CALL MYSCHEMA.HSCLPROC (1,0 , 7,0);
CALL MYSCHEMA.HSCLPROC(1 , 7);


Zwischen dem 1. Parameter und dem Komma, musste ich allerdings ein Blank einfügen. Ohne Blank habe ich ebenfalls eine Fehlermeldung (jedoch nicht die o.g. erhalten!)

Prüfe sicherheitshalber nochmals die Berechtigungen und den SQL-Path.
SQL-Naming vergibt die Berechtigungen nicht unbedingt so, wie wir es auf der AS/400 (oder wie das Ding jetzt heißt) gewohnt sind.

@Baldur:
Explizites Casting im SQL-Call-Befehl ist nur für die folgenden Datentypen zulässig:
BLOB, CLOB, DBCLOB, DATE, TIME, TIMESTAMP

Birgitta

Allrounder
07-04-08, 10:01
Vielen Dank schonmal für die Hilfe.

Berechtigungen sind in Ordnung, die hatte ich nach Erstellen der Stored Procedure nachträglich vergeben.

Casten hat wie schon von Birgitta erwähnt nicht funktioniert:
[SQL0104] Token DEC ungültig. Gültige Token: : BLOB CLOB DATE DBCLOB DLVALUE TIME

Der Aufruf über
call mylib.test(123456,0 , 1234567,0)
hat leider auch nicht funktioniert, immer noch der gleiche Fehler.

Ich werde weiter testen und euch auf dem laufenden halten.

Gruß Allrounder

Pikachu
07-04-08, 10:25
Die Parameter des CLPs:


DCL VAR(&PARM1) TYPE(*DEC) LEN(6 0)
DCL VAR(&PARM2) TYPE(*DEC) LEN(7 0)


Nur zur Sicherheit:
Wie sind denn die Parameter beim Befehl PGM im CLP angegeben?

BenderD
07-04-08, 11:29
was sagt denn der select * from qsys2.sysprocs???

D*B


Vielen Dank schonmal für die Hilfe.

Berechtigungen sind in Ordnung, die hatte ich nach Erstellen der Stored Procedure nachträglich vergeben.

Casten hat wie schon von Birgitta erwähnt nicht funktioniert:
[SQL0104] Token DEC ungültig. Gültige Token: : BLOB CLOB DATE DBCLOB DLVALUE TIME

Der Aufruf über
call mylib.test(123456,0 , 1234567,0)
hat leider auch nicht funktioniert, immer noch der gleiche Fehler.

Ich werde weiter testen und euch auf dem laufenden halten.

Gruß Allrounder