[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Oct 2011
    Beiträge
    23

    SQL Stored Procedure mit Dateinamen in einer Variablen aufrufen

    Liebe Gemeinde,
    gibt es die Möglichkeit einen Dateinamen als Variable an eine Stored Procedure zu übergeben?
    Die Stored Procedure soll ein Update auf die in der Variablen übergebenen Datei ausführen.

    Das unten angegebene Beispiel soll mein Anliegen etwas verdeutlichen.

    create or replace procedure LIB1.TEST (
    in §LIB char(10) default(''),
    in §FILE char(10),
    in FELDA char(6) default(' '),
    in FELDB char(30) default(' '))
    Language sql
    Deterministic
    P1: begin
    update §LIB / §FILE set FELDB = (select FELDC from FILE_z where FELDD = FELDA) ;
    end P1 ;


    call TEST ('LIB_x', 'FILE_y') ;

    Gibt es vielleicht ein Repository mit vielen Beispielen von Stored Procedures?

    Im Voraus vielen Dank für einige gute Tipps.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Leider sind Variablen als Lib und Table nie erlaubt.
    Allerdings gibt es die Execute-Anweisung mit der ynmaische SQL's ausgeführt werden können.
    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
    Oct 2011
    Beiträge
    23
    Vielen Dank für deine schnelle Antwort!
    Hättest du vielleicht ein kleines Beispiel für ein dynamisches SQL mit Execute-Anweisung in der Stored Procedure?

    Zur Not kann ich meine individuelle Datei auch immer mit demselben Namen in der QTEMP speichern, auf die die Stored Procedure dann das Update ausführt, aber eine variable lösung wäre natürlich eleganter. Die nicht angesprochenen, dann unterschiedlichen Felder interessieren die Stored Procedure vermutlich nicht.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    So flexibelmuss eine Stored Procedure (SP) ja nicht sein.
    Das Konzept dahinter ist ja, dass ich eine SP für eine bestimmte Aufgabe schreibe.
    Wenn man also für verschiedene Objekte SP's braucht, so macht man für jedes Objekt eine SP.
    Immerhin kostet eine SP "keinen Strom", wie es so schön heißt.

    Und der Aufrufer ruft dann nicht
    call AnyProc('MYLIB', 'MYTABLE', ...)
    sondern
    call MyLib.MyTableProc(...)

    Konzeptionell ist das wesentlich klarer und auch sicherer.

    Hier:
    https://www.ibm.com/support/knowledg...e/pdftable.htm
    findest du SQL-Reference und SQL-Programming Handbücher.
    Die habe ich mir auch runtergeladen und da schaue ich immer wieder gerne rein.
    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

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Du machst das einfach mit dynamischem SQL, d.h. du bildest zur Laufzeit einen String mit dem kompletten SQL Statement und dann führst Du es mit EXECUTE IMMEDIATE aus.

    Etwa so:

    Code:
    Create Or Replace Procedure LIB.TEST (In PARLIB Char(10) Default (''),
                                           In PARFILE Char(10), 
                                           In PARFELDA Char(6) Default (' '),
                                           In PARFELDB Char(30) Default (' '))
          Language SQL
          Deterministic
    P1: Begin
        Declare CmdSQL  VarChar(1096) Not NULL Default '';
        
        Set CmdSQL = 'Update ' concat Trim(ParLib)   concat '/' concat Trim(ParFile) concat
                       ' set ' concat Trim(ParFeldB) Concat 
                               ' = (Select FeldC
                                      From File_Z
                                      Where FeldD = ''' concat ParFeldA Concat ''')';
        Execute Immediate CmdSQL;                              
       
    End P1;
    Noch ein paar kleine Anmerkungen.
    1. Du solltest NIE Sonderzeichen in Deinem Source Code verwenden, da diese nicht immer international sind und dann auf anderen Maschinen Probleme bereiten können. Gerade das Paragraphen-Zeichen kann in der US-amerikanischen Umgebung nicht verwendet werden. In deren Zeichensatz steht an dieser stelle das @-Zeichen.

    2. Du solltest eine Fehler-Prüfung einbauen.
    Entweder über einen Handler oder zumindest über GET DIAGNOSTICS den SQLCODE (DB2_RETURNED_SQLCODE), SQLSTATUS (RETURNED_SQLSTATE)oder die Fehlermeldung (MESSAGE_TEXT) ermitteln.

    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
    Mar 2002
    Beiträge
    5.286
    ... ohne errorhandler kommst du nicht bis zur Abfrage des SQLCODES.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Sep 2005
    Beiträge
    385
    Oder du machst deine Version auf *curlib und rufst vorher ein cl, das als Parameter die Lib empfängt.
    Parameter gefüllt, rette curlib, setze curlib
    Parameter leer setze gerettete Curlib wieder ein.

    nicht schön, aber immer richtig

    Der ILEMax

  8. #8
    Registriert seit
    Oct 2011
    Beiträge
    23
    Super, vielen Dank für eure Beiträge!
    Birgitta, die Set-Anweisung entspricht doch in etwa dem prepare im embedded SQL? Das ist genau, was ich gesucht habe.
    Kann ich den Sqlcode einfach als out-Parameter definieren und ihn im aufrufenden Programm ggf. interpretieren?
    Viele Grüße und ein schönes Wochenende

  9. #9
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Die SET Anweisung ist lediglich die String zuordnung (wie EVAL im RPG).
    Das Execute Immediate macht automatisch das Prepare.
    Du kannst es aber auch in 2 Steps machen, zuerst ein Prepare und dann das Execute.
    Der Vorteil beim Prepare ist, dass du das Statement öfters ausführen kannst, es aber nur 1 mal interpretiert (PREPARE) werden muss.
    Außerdem kannst du dann auch beim Execute, mit Hilfe der USING Klausel, Hostvariablen verwenden und somit mit Parametermarkern arbeiten, was mehr Sicherheit in diversen Bereichen liefert.

    lg Andreas

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    Die SET Anweisung ist lediglich die String zuordnung (wie EVAL im RPG).
    Das Execute Immediate macht automatisch das Prepare.
    Du kannst es aber auch in 2 Steps machen, zuerst ein Prepare und dann das Execute.
    Der Vorteil beim Prepare ist, dass du das Statement öfters ausführen kannst, es aber nur 1 mal interpretiert (PREPARE) werden muss.
    Außerdem kannst du dann auch beim Execute, mit Hilfe der USING Klausel, Hostvariablen verwenden und somit mit Parametermarkern arbeiten, was mehr Sicherheit in diversen Bereichen liefert.

    lg Andreas
    ... allerdings sind wir da soweit wie vorher.
    Auch in dynamischem SQL bzw. beim PREPARE und EXECUTE bzw. bei der Verwendung von Parameter Marken darf die Datei nicht als Variabler Wert gehandelt werden.
    Deshalb muss in diesem Fall immer ein PREPARE und EXECUTE erfolgen (oder eben auch ein EXECUTE IMMEDIATE).
    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

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Allerdings ist das Konzept nicht transparent (siehe meinen Kommentar oben).
    Nicht alles was machbar ist, ist auch sinnvoll.

    Wenn die SP mehrfach aufgerufen wird, erfolgt jedes mal aufs neue die Analyse des Statements, Zugriffspfad usw. Insgesamt kann das durchaus von Nachteil sein.

    Ein Prepare macht allerdings nur Sinn, wenn das Statement auch innerhalb der SP mehrfach benutzt wird. Den Ansatz dazu sehe ich allerdings nicht.
    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

  12. #12
    Registriert seit
    Oct 2011
    Beiträge
    23
    Die SP lässt sich nun schon fehlerlos erstellen, aber bei der Ausführung gibt es noch Probleme.

    Wie kann ich die SP debuggen?

    Habt ihr vielleicht noch ein Beispiel für einen Error Handler? Mir würde die Rückmeldung des SQLCODE reichen.
    Danke vorab. :-)

Similar Threads

  1. Fehler bei Stored Procedure
    By KM in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 25-11-17, 11:09
  2. Aufruf einer SQL Stored Procedure in SQLRPGLE
    By Witaseck in forum NEWSboard Programmierung
    Antworten: 20
    Letzter Beitrag: 14-12-16, 18:23
  3. Java stored procedure
    By Sven Schneider in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 03-09-02, 08:31
  4. Stored Procedure
    By lorenzen in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 27-08-02, 15:59
  5. Löschen/Überschreiben einer Stored Procedure
    By Frank Pusch in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 13-06-01, 18:57

Berechtigungen

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