Anmelden

View Full Version : SQL-Prozedur Aufruf Fehler



Seiten : [1] 2

chrisonline
07-12-07, 15:05
Wollte soeben meine erste SQL Prozedur generieren nur leider erhalte ich immer wieder einen Fehler :-(

Habe auf der AS400 folgende SQL Prozedure generiert:
CREATE PROCEDURE GRA_PHP/SP_RPG_HELLO( INOUT PARM CHAR( 20 ) )
EXTERNAL NAME GRA_PHP/H_WORLD
LANGUAGE RPGLE
PARAMETER STYLE GENERAL

Danach habe ich dann die Prozedur so aufgerufen:
CALL GRA_PHP/SP_RPG_HELLO('')

Erhalte aber immer wieder diese Fehler:
Nachricht . . . : Attribut IN, OUT oder INOUT für Parameter 1 in Prozedur
SP_RPG_HELLO in GRA_PHP ungültig.
Ursache . . . . : Das Attribut IN, INOUT oder OUT, das für Parameter 1 bei
der Definition der Prozedur angegeben wurde, ist nicht gültig. Der
Parametername ist PARM. Einer der folgenden Fehler ist aufgetreten:
-- Das Attribut ist mit dem Parameter in der Anweisung CALL nicht
konsistent. Wurde der Parameter als INOUT oder OUT deklariert, muss der
Parameter in der Anweisung CALL als Host-Variable angegeben werden.

Nachrichten ID: SQL0469

-------------

Im callenden RPG Programm ist momentan nur ein ENTRY Parm definiert und dieser wird mit "Hello World" befüllt und dann mittels INLR wieder zurückgegeben.

Was mache ich falsch das ich die SQL Prozedur nicht aufrufen kann?

Fuerchau
07-12-07, 17:33
Wenn der Parameter CHAR(20) ist, musst du auch mit CHAR(20) aufrufen:

CALL GRA_PHP/SP_RPG_HELLO(cast('' as char(20))

Ggf. wird aber ein OUT-Parameter abgewiesen, da dies nur in embedded SQL geht.

chrisonline
07-12-07, 18:52
Danke!
OK werde ich mal so probieren!

B.Hauser
07-12-07, 19:32
Hallo,

das Problem ist, dass bei einem Parameter, der als INOUT defineirt ist keine Konstante übergeben werden darf. (Das ist z.B. in RPG in Verbindung mit Prototyping auch nicht möglich!)

Wie sollte der Rückgabewert sonst ausgegeben werden?

chrisonline
08-12-07, 11:52
D.h. ich müsste es mit einem IN Parameter und einem zusätzlichen OUT Parameter lösen oder?

Also IN CHAR 20 und dann noch einen OUT CHAR 20 ?

Fuerchau
08-12-07, 19:06
Dann solltest du CREATE FUNCTION mit RETURNING wählen.
Diese kannst du dann im Select, Update ... SET oder Insert bzw. bei embedded SQL mit SET aufrufen.

Eine Prozedur mit INOUT bzw. OUT kannst du nur in embedded SQL und nicht native aufrufen.

chrisonline
09-12-07, 16:04
Bin totaler neuling im Bereich SQL Prozeduren :-) Deshalb blicke ich jetzt nicht ganz durch ...

Also wie kann ich es lösen wenn ich mit CALL PROZEDUR eine Prozedur aufrufen will die wiederum ein RPG Programm aufruft und ich der Prozedur aber einige IN Parameter gebe und auch einige OUT Parameter zurückbekommen will?

B.Hauser
09-12-07, 17:24
Hallo,

Du kannst natürlich IN, OUT und INOUT Parameter definieren und entsprechend aufrufen, nur musst Du bei den OUT oder INOUT-Parametern eine Variable angeben.

Wenn Du also die Stored Procedure aus einer anderen Stored Procedure oder aus einem Programm mit embedded SQL aufrufst, gibts Du an den Stellen, an denen die Ausgabe-Parameter erforderlich sind Host-Variablen an. (Genau so, wie Du es beim direkten Aufruf eines RPG-Programms machen würdest.)

Bei der Ausführung im interaktiven SQL oder iSeries Navigator ist dies natürlich nicht möglich. Das war Dein Fehler vom Freitag.

chrisonline
10-12-07, 08:13
D.h. ich kann nicht direkt eine SQL-Prozedur aufrufen und da OUT Parameter verwenden oder?

Meine Problem ist, dass ich mittels PHP und ODBC Zugriff eine SQL-Prozedur aufrufen will und diese sollte wiederum ein RPG Programm aufrufen. Das ganze sollte dann mir die benötigten Parameter zurücksenden. Ich habe also IN Parameter und brauche diverse OUT Parameter.

Wie kann ich dies nun lösen, wenn ich bei direkten Aufruf einer SQL-prozedur keinen OUT Parameter angeben kann!?! Sofern ich das ganze jetzt richtig verstanden haben :-)

mk
10-12-07, 08:57
Hallo,

warum muss es denn aus PHP sein ?

Frage doch mal deine Webentwickler, ob sie Dir nicht auf deinen Webserver eine AJAX Request senden können.
Der Ajax Request kann direkt ein RPG CGI Programm starten.

Oder die PHP Anwendung sendet Dir einach mit POST
ein Formular mit den Feldern.
Ein GET Request kann auch eingesetzt werden.
Beides kannst DU mit RPG CGI verarbeiten. Dazu benötigt man keinerlei PHP Kenntnisse.

Gruss
Michael :)