[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2007
    Beiträge
    14

    Question SQL-Prozedur Aufruf Fehler

    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?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Dec 2007
    Beiträge
    14
    Danke!
    OK werde ich mal so probieren!

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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?
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Dec 2007
    Beiträge
    14
    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 ?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Dec 2007
    Beiträge
    14
    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?

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Dec 2007
    Beiträge
    14
    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 :-)

  10. #10
    Registriert seit
    Jan 2001
    Beiträge
    833
    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

  11. #11
    Registriert seit
    Dec 2007
    Beiträge
    14
    Es muss deshalb aus PHP sein, da ich die Anforderung habe aus einem bereits bestehenden Webshop Daten anzuzeigen von div. RPG Programmen.

    D.h. der Webshop existiert und ist von einer anderen Firma und diese sollten dann div. PHP Scripte aufrufen und erhalten dann die Preise oder ähnliches retour.

    Und mit Stored Procedures hätte ich gedacht geht das am einfachsten.
    Stored Procedures einrichten und diese werden dann einfach aufgerufen von dem externen Webserver.

    Und es kommt leider noch dazu, dass dies natürlich ASAP laufen soll bzw. am besten schon seit gestern funktionieren :-)

    RPG CGI klingt sehr gut, jedoch bis das ganze läuft ist es ohne Erfahrung glaube ich etwas Zeitaufwendig.

    Da wären die Stored Procedures schneller eingerichtet ....

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Mit PHP, bzw. ODBC musst du dann Parametermarker verwenden die dann auf eine Variable verweisen.

    Ich kenne nun PHP nicht, sondern verwende z.B. ADO.
    Hier benötige ich ein Command-Objekt, dem ich dann die Parameter auch benenne:

    MyCmd.Commandtext = "call myproc(?, ?)"
    MyCmd.Parameters.Append MyCmd.CreateParameter("P1", adVarChar, 10)
    MyCmd.Parameters.Append MyCmd.CreateParameter("P2", adVarChar, 10)

    MyCmd(0) = "WERT1" <= IN-Wert
    MyCmd.Execute
    MyVar = MyCmd(1) <= OUT-Wert

    Ich denke PHP wird ähnliches unterstützen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. SQL Substring (Fehler 42703)
    By olbe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 28-12-06, 13:53
  2. Finde Fehler bei SQL nich...
    By deni87991 in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 08-08-06, 13:50
  3. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  4. Fehler im SQL bzw. Joblog
    By GraueEminenz in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 10-07-06, 11:58
  5. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •