[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Oct 2004
    Beiträge
    53

    Eingebettetes SQL im RPG

    Hallo,

    ich arbeite grad an einem RPG Programm das mit SQL-Cursorn arbeitet.

    Nun bin ich an den Punkt gekommen, wo ich bei der Cursordeklaration einen substring-Befehl anwenden will, mit dynamischen Positionsnummer.

    z.b.

    select * from A where subst(feldA, os1, os2) = 'XXX'

    Diese dynamische Positionsnummern "pos1" und "pos2" fliegen mir aber bei der Compilierung um die Ohren. Egal ob ich die Werte als nummerische Felder definiere oder als Alphanummerische Felder.

    Geht das gar nicht biem Substr? oder mach ich was falsch?

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.376
    pos1 und pos2 müssen zum Zeitpunkt des Prepare bekannt sein => das geht mit statischem SQL nicht, sondern nur mit dynamischem SQL, da kann man zur Laufzeit den Prepare machen.

    D*B

    Zitat Zitat von Souljumper Beitrag anzeigen
    Hallo,

    ich arbeite grad an einem RPG Programm das mit SQL-Cursorn arbeitet.

    Nun bin ich an den Punkt gekommen, wo ich bei der Cursordeklaration einen substring-Befehl anwenden will, mit dynamischen Positionsnummer.

    z.b.

    select * from A where subst(feldA, os1, os2) = 'XXX'

    Diese dynamische Positionsnummern "pos1" und "pos2" fliegen mir aber bei der Compilierung um die Ohren. Egal ob ich die Werte als nummerische Felder definiere oder als Alphanummerische Felder.

    Geht das gar nicht biem Substr? oder mach ich was falsch?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Oct 2004
    Beiträge
    53
    wie geht dynamisches sql unter rpg?

    wie müsste da so ein declare mit aufruf aussehen.

    dynamisches sql kenn ich bisher nur von oracle, habs aber unter db2 und rpg nie verwendet.

    ein kurzes syntaxbeispiel oder so wäre fein?

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.376
    ... da sollte es hier im Forum schon Beispiele geben - und wenn man sich die Mühe des suchens ersparen will, gibt es immer noch das FM...

    D*B

    Zitat Zitat von Souljumper Beitrag anzeigen
    wie geht dynamisches sql unter rpg?

    wie müsste da so ein declare mit aufruf aussehen.

    dynamisches sql kenn ich bisher nur von oracle, habs aber unter db2 und rpg nie verwendet.

    ein kurzes syntaxbeispiel oder so wäre fein?
    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.932
    Hallo,

    mit welchem Release arbeitest DU?
    Ich habe gerade unter V5R4 ein Mini-Programm mit embedded SQL Cursor und Substring mit Host-Variablen in den Where-Bedinungen erstellt. Die Ausführung läuft ebenfalls problemlos.


    PHP-Code:
    D BegPos          S              5I 0            
    D Len             S              5I 0            
    D Text            S             50A        
     
    /Free      
        BegPos 
    3;                                                          
        
    Len    5;                                                          
                                                                             
        
    Exec SQL  Declare CsrC01 Cursor For    
              
    Select Name1F From MYTABLE
                 Where Substr
    (Name, :BegPos, :Len) = 'ABCDE'
                                                                             
        
    Exec SQL  Open CsrC01;                                               
        
    Dsply SQLCOD;                                                        
        
    Exec SQL  Fetch Next From CsrC01 into :Text;                  
        
    Dsply SQLCOD;                                             
        
    Dsply Text;           
        
    Exec SQL  Close CsrC01;  
        *
    INLR = *ON;                                            
     /
    End-Free 
    ... übrigens in SQL heißt die scalare Funktion SUBSTR (und nicht SUBST, das ist RPG!)

    Birgitta
    Birgitta Hauser

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

  6. #6
    Registriert seit
    Oct 2004
    Beiträge
    53
    hab hier v5r1

    mit free rpg arbeiten wir gar nicht, nur rpg 4.

    muss ich beim dynamischen sql jedesmal den prepare und declare ausführen bevor ich einen open mache?

    Mein programm wird nämlich von einem asy-job aufgerufen und bin mir jetzt nicht sicher warum ich andauernd die fehlercodes 514 kriege.

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.932
    Das funktioniert mit klassischem RPG genauso.
    Es funktioniert sogar mit RPGIII.

    Hast Du mal versucht SUBSTR statt SUBST zu scheiben.

    Beim dynamischen SQL wird der SQL-Befehl zur Laufzeit zusammengepfriemelt und dann in einen ausführbaren SQL-Befehl (geschieht beim PREPARE) konvertiert.

    Deshalb: Prepare, Declare, Open ist immer erforderlich. Es sei den das gleiche SQL statement wird mehrfach ausgeführt, dann genügt ein OPEN.

    Birgitta
    Birgitta Hauser

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

  8. #8
    Registriert seit
    Oct 2004
    Beiträge
    53
    hm

    hab mr jetzt mal ein minimal beispiel gebastelt, das funktioniert nur wenn ich in der reihenfolge

    declare, prepare, open vorgehe

    ich finde ein beispiel für prepare, declare, open auch auf den ibm seiten, aber die funktionieren bei mir nicht....

    sqlcode 440 oder 514 sind da die regelmäßigen antworten.

  9. #9
    Registriert seit
    Oct 2004
    Beiträge
    53
    das problem scheint mein substringbefehl zu sein.

    sobald ich in meinem vorbereiteten statement string ein

    substr(feld1, 1, ?) = ?

    einbaue, schlägt der prepare fehl.

    ist die syntax bei substr anders?

  10. #10
    Registriert seit
    Oct 2004
    Beiträge
    53
    er kann es nicht, aus welchen gründen auch immer.

    stmnt = 'substr(feld1, 1, ' + %trim(len) + ') = ?'

    funktioniert -.-*

Similar Threads

  1. ILE RPG / SQL Füllen einer Feldgruppe
    By homue in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 18-07-07, 16:47
  2. embedded SQL in RPG
    By muadeep in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 03-08-06, 13:25
  3. RPG mit Embedded SQL, JOIN ..
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 18-06-06, 12:14
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. embedded SQL in ILE RPG, UPDATE
    By Zupfl50 in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 06-10-04, 21:04

Berechtigungen

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