[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Oct 2003
    Beiträge
    117

    Externe Stored Procedure

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

    PHP-Code:
    SQL-Status42884
    Vendorencode
    : -440
    Nachricht
    : [SQL0440Routine MYCLP in MYLIB mit angegebenen Parametern nicht gefundenUrsache  . . . . :  Eine Funktion oder Prozedur mit dem angegebenen Namen und verträglichen Argumenten wurde nicht gefundenFehlerbeseitigung:  In der Anweisung CALL oder im Funktionsaufruf die korrekte Anzahl und Art der Parameter angeben. Die Anforderung wiederholen
    Die Parameter des CLPs:
    PHP-Code:
    DCL        VAR(&PARM1TYPE(*DECLEN(6 0)
    DCL        VAR(&PARM2TYPE(*DECLEN(7 0
    Die Stored Procedure lautet:
    PHP-Code:
    CREATE PROCEDURE MYLIB.TEST 
        
    IN PARM1 DECIMAL(60) , 
        
    IN PARM2 DECIMAL(70) ) 
        
    LANGUAGE CL 
        SPECIFIC MYLIB
    .TEST 
        NOT DETERMINISTIC 
        MODIFIES SQL DATA 
        CALLED ON NULL INPUT 
        EXTERNAL NAME 
    'MYLIB/MYCLP' 
        
    PARAMETER STYLE SQL 
    Aufruf aus SQL:

    PHP-Code:
    call mylib.test(1234561234567
    Wo ist der Fehler? Wie muss ich die Parameter definieren, dass es funktioniert?

  2. #2
    Registriert seit
    May 2002
    Beiträge
    2.642

    auf der ISeries R530 ?

    Hallo,
    läuft auf der ISeries das Release R530 ?

  3. #3
    Registriert seit
    Oct 2003
    Beiträge
    117
    Nein, V5R4M0. (Das Forum will min. 20 Zeichen, jetzt müsste es passen)

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    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

    Zitat Zitat von Allrounder Beitrag anzeigen
    Beim Versuch, ein CLP über eine Externe Stored Procedure aufzurufen, bekomme ich den Fehler:

    PHP-Code:
    SQL-Status42884
    Vendorencode
    : -440
    Nachricht
    : [SQL0440Routine MYCLP in MYLIB mit angegebenen Parametern nicht gefundenUrsache  . . . . :  Eine Funktion oder Prozedur mit dem angegebenen Namen und verträglichen Argumenten wurde nicht gefundenFehlerbeseitigung:  In der Anweisung CALL oder im Funktionsaufruf die korrekte Anzahl und Art der Parameter angeben. Die Anforderung wiederholen
    Die Parameter des CLPs:
    PHP-Code:
    DCL        VAR(&PARM1TYPE(*DECLEN(6 0)
    DCL        VAR(&PARM2TYPE(*DECLEN(7 0
    Die Stored Procedure lautet:
    PHP-Code:
    CREATE PROCEDURE MYLIB.TEST 
        
    IN PARM1 DECIMAL(60) , 
        
    IN PARM2 DECIMAL(70) ) 
        
    LANGUAGE CL 
        SPECIFIC MYLIB
    .TEST 
        NOT DETERMINISTIC 
        MODIFIES SQL DATA 
        CALLED ON NULL INPUT 
        EXTERNAL NAME 
    'MYLIB/MYCLP' 
        
    PARAMETER STYLE SQL 
    Aufruf aus SQL:

    PHP-Code:
    call mylib.test(1234561234567
    Wo ist der Fehler? Wie muss ich die Parameter definieren, dass es funktioniert?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    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
    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Ggf. ist auch explizites casten erforderlich:

    call mylib.test(dec(123456, 6, 0), dec(1234567, 7, 0) )
    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
    Aug 2001
    Beiträge
    2.875
    Hallo,

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

    PHP-Code:
    CREATE PROCEDURE MYSCHEMA.HSCLPROC 
        
    IN PARM1 DECIMAL(70), 
        
    IN PARM2 DECIMAL(60)) 
        
    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:
    PHP-Code:
    CALL MYSCHEMA.HSCLPROC (1,7,0);
    CALL MYSCHEMA.HSCLPROC(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
    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

  8. #8
    Registriert seit
    Oct 2003
    Beiträge
    117
    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

  9. #9
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Zitat Zitat von Allrounder Beitrag anzeigen
    Die Parameter des CLPs:
    PHP-Code:
    DCL        VAR(&PARM1TYPE(*DECLEN(6 0)
    DCL        VAR(&PARM2TYPE(*DECLEN(7 0
    Nur zur Sicherheit:
    Wie sind denn die Parameter beim Befehl PGM im CLP angegeben?

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    was sagt denn der select * from qsys2.sysprocs???

    D*B

    Zitat Zitat von Allrounder Beitrag anzeigen
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Oct 2003
    Beiträge
    117
    Zitat Zitat von Pikachu Beitrag anzeigen
    Nur zur Sicherheit:
    Wie sind denn die Parameter beim Befehl PGM im CLP angegeben?
    PHP-Code:
                 PGM        PARM(&PARM1 &PARM2)                         
                 
    DCL        VAR(&PARM1TYPE(*DECLEN(6 0)            
                 
    DCL        VAR(&PARM2TYPE(*DECLEN(7 0

    Zitat Zitat von BenderD Beitrag anzeigen
    was sagt denn der select * from qsys2.sysprocs???

    D*B
    Die Stored Procedure ist auch hier korrekt gespeichert.

  12. #12
    Registriert seit
    Oct 2003
    Beiträge
    117
    Das Problem ist gelöst. Vielen Dank für die vielen Antworten.

    Der SQL-Fehler, der auf ein Problem des Überladens bzw. die Parameterübergabe hindeudete, war irreführend. Ein Aufruf der SP im interaktiven SQL auf der iSeries hat funktioniert.

    Dort war die LIBL korrekt eingestellt. Alles lief problemlos.
    In der SP ist der Objektname des CL's zwar qualifiziert angegeben, es fehlten beim Aufruf über den Navigator jedoch weitere Bibliotheken, die das CL benötigt.

    Ich werde zukünftig die SQL-Fehlermeldungen im Navigator mit etwas mehr Vorsicht genießen.

Similar Threads

  1. Berechtigung für Stored Procedure
    By rebe in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 12-10-06, 11:22
  2. SQL Stored Procedure verschwindet
    By florian in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 17-05-06, 16:08
  3. Stored Procedure mit Problemen
    By peter.kinne in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 15-04-05, 09:04
  4. Java Stored Procedure
    By HeisigA in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 21-02-05, 18:58
  5. Löschen/Überschreiben einer Stored Procedure
    By Frank Pusch in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 13-06-01, 17:57

Berechtigungen

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