[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2003
    Beiträge
    195

    Exclamation SQL - Cursor vernichten ?!?

    hallo allerseits,

    ich habe folgendes problem und bin daher auf der suche nach einer lösung:

    aufgrund verschiedener bedingungen werden unterschiedliche sql-statements generiert, die je nach bedingung ausgeführt werden sollen. jetzt habe ich aber das problem das der cursor immer das erste zutreffende statement auswählt und für dieses werte zurückgibt. kann mir bitte jemand erklären warum und ob man das ändern kann ? cursor vernichten oder so in etwa ?

    hier die entsprechenden codezeilen für die vorbereitung
    /Free
    #SQLSTM =
    'Select TXTXNR, TXTXB1, TXTXB2, TXTXB3, TXTXB4, TXTXB5, TXTXB6, ' +
    'TXSTK1, TXSTK2, TXSTK3 from TABD ' +
    'WHERE TXSART = ''TX'' and TXFIRM = ''1'' and TXWKNR = ''000'' ' +
    'and TXTXRT = ''PE''';

    #SQLINB = 'and TXTXB4 in(''BFS'', ''B40'', ''B60'', ''B100'')';
    #SQLINS = 'and TXTXB4 in(''SFS'', ''SR'', ''SI'', ''SAAB'')';
    #SQLOR = ' or TXSART = ''TX'' and TXFIRM = ''1'' ' +
    'and TXWKNR = ''000'' and TXTXRT = ''PE'' and TXTXB4 = '' ''';
    /End-Free

    C INITE ENDSR

    hier die bedingungen

    If C0PNR# <> *Zeros;
    #SQLSEL = ' and TXTXNR = ' + %Char(C0PNR#);
    EndIf;
    If C0NAME <> *Blanks;
    #SQLSEL = ' and TXTXB1 like ''' + %Trim(C0NAME) + '%''';
    EndIf;
    If C0ART <> *Blanks;
    #SQLSEL = ' and TXTXB4 like ''' + %Trim(C0ART) + '%''';
    EndIf;
    If C0KFZ <> *Blanks;
    #SQLSEL = ' and TXTXB5 like ''' + %Trim(C0KFZ) + '%''';
    EndIf;

    Select;
    When (*In31 = '1' and *In21 = '1') or (*In34 = '1' and *In21 = '1');
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLORP;
    When (*In31 = '1' and *In21 = '0') or (*In34 = '1' and *In21 = '0');
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLORN;
    When *In32 = '1' and *In21 = '1';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORP;
    When *In32 = '1' and *In21 = '0';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORN;
    When *In33 = '1' and *In21 = '1';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORP;
    When *In33 = '1' and *In21 = '0';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORN;
    EndSl;

    /End-Free

    und zu guter letzt das fetch

    *
    * Statement vorbereiten
    *
    C/EXEC SQL
    C+ PREPARE S1 FROM: #SQLSTM
    C/END-EXEC
    *
    * Cursor defnieren
    *
    C/EXEC SQL
    C+ DECLARE C1 CURSOR FOR S1
    C/END-EXEC
    *
    * Cursor schliessen
    *
    C/EXEC SQL
    C+ CLOSE C1
    C/END-EXEC
    *
    * Cursor öffnen
    *
    C/EXEC SQL
    C+ OPEN C1
    C/END-EXEC
    *
    * alle Zeilen laden
    *
    C Eval SIDX2 = 5000
    C/EXEC SQL
    C+ FETCH FROM C1 FOR :SIDX2 ROWS INTO :S00S01L:IND_ARRAY
    C/END-EXEC
    *
    C Eval I# = SQLERRD(3)

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo,

    wenn Du den Cursor nicht am Ende der Verarbeitung schließst, solltest Du ihn unmittelbar vor dem Prepare schließen. Der Close vor dem Open ist zu spät.

    Ein erneuter Prepare ist nicht erfolgreich, solange der Cursor aus der vorherigen Verarbeitung noch offen ist.
    Wenn Du den SQL-Code oder Status nach dem Prepare-Statement abgefragt hättest, hättest Du eine entsprechende Fehlermeldung erhalten.

    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

  3. #3
    Registriert seit
    Apr 2003
    Beiträge
    195
    hallo brigitta,

    vielleicht habe ich ja doch nicht so genau erklärt wie ich es wollte.

    nach den bedingungen, die in einer subroutine laufen, wird die fetch subroutine aufgerufen und die daraus erhaltenen daten zur anzeige gebracht. der zyklus wiederholt sich da sich die bedingungen jederzeit ändern können.

    ************************************************** **************
    * SR000 HAUPT - ROUTINE
    ************************************************** **************
    C SR000 BEGSR
    C ExSr SR100
    C ExSr SR110
    C ER000 ENDSR
    ************************************************** **************
    C/Eject
    *---------------------------------------------------------------
    * SR100 - Subfile SFL000 initialisieren
    *---------------------------------------------------------------
    C SR100 BegSr
    C Eval RNRA# = 0
    C Eval *In80 = '0'
    C Write CTL000
    C Eval *In80 = '1'
    C ER100 EndSr
    C/Eject
    *---------------------------------------------------------------
    * SR110 - Subfile SFL000 füllen
    *---------------------------------------------------------------
    C SR110 BegSr
    *
    /Free
    If C0PNR# <> *Zeros;
    #SQLSEL = ' and TXTXNR = ' + %Char(C0PNR#);
    EndIf;
    If C0NAME <> *Blanks;
    #SQLSEL = ' and TXTXB1 like ''' + %Trim(C0NAME) + '%''';
    EndIf;
    If C0ART <> *Blanks;
    #SQLSEL = ' and TXTXB4 like ''' + %Trim(C0ART) + '%''';
    EndIf;
    If C0KFZ <> *Blanks;
    #SQLSEL = ' and TXTXB5 like ''' + %Trim(C0KFZ) + '%''';
    EndIf;

    Select;
    When (*In31 = '1' and *In21 = '1') or (*In34 = '1' and *In21 = '1');
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLORP;
    When (*In31 = '1' and *In21 = '0') or (*In34 = '1' and *In21 = '0');
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLORN;
    When *In32 = '1' and *In21 = '1';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORP;
    When *In32 = '1' and *In21 = '0';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORN;
    When *In33 = '1' and *In21 = '1';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORP;
    When *In33 = '1' and *In21 = '0';
    #SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORN;
    EndSl;

    /End-Free
    C ExSr SR112
    C Eval SIDX1 = 1
    C Eval %OCCUR(S00S01L) = SIDX1
    C DOW SIDX1 <= I#
    C Add 1 RNRA#
    C Move ' ' S0AUSW
    C Move L1TXNR S0PERS#
    C Movel L1TXB1 S0NAME
    C Movel L1TXB2 S0INFO
    C Movel L1TXB4 S0ART
    C Movel L1TXB6 S0KFZ
    C Movel L1STK1 S0STK1
    C Movel L1STK2 S0STK2
    C Movel L1STK3 S0STK3
    C Write SFL000
    C EVAL SIDX1 = SIDX1 + 1
    C EVAL %OCCUR(S00S01L) = SIDX1
    C EndDo
    *
    C ExSr SR140
    C ER110 EndSr
    *---------------------------------------------------------------
    * SR112 - alle auslesen
    *---------------------------------------------------------------
    C SR112 BegSr
    C CLEAR *ALL S00S01L
    *
    * Statement vorbereiten
    *
    C/EXEC SQL
    C+ PREPARE S1 FROM: #SQLSTM
    C/END-EXEC
    *
    * Cursor defnieren
    *
    C/EXEC SQL
    C+ DECLARE C1 CURSOR FOR S1
    C/END-EXEC
    *
    * Cursor schliessen
    *
    C/EXEC SQL
    C+ CLOSE C1
    C/END-EXEC
    *
    * Cursor öffnen
    *
    C/EXEC SQL
    C+ OPEN C1
    C/END-EXEC
    *
    * alle Zeilen laden
    *
    C Eval SIDX2 = 5000
    C/EXEC SQL
    C+ FETCH FROM C1 FOR :SIDX2 ROWS INTO :S00S01L:IND_ARRAY
    C/END-EXEC
    *
    C Eval I# = SQLERRD(3)
    *
    * Cursor schliessen
    *
    C/EXEC SQL
    C+ CLOSE C1
    C/END-EXEC

    C ER112 EndSr
    C/Eject
    *---------------------------------------------------------------

    wie man sehen kann wird der cursor am ende der verarbeitung geschlossen.

    also warum funktioniert es trotzdem nicht ???

  4. #4
    Registriert seit
    Apr 2003
    Beiträge
    195
    hallo und danke

    habe den fehler bereits gefunden. dadurch dass #sqlstm vom typ varying ist und eigentlich nur einmal initialisiert wird, schaukelt sich das ganze auf. #sqlstm muss jedesmal zuerst mit einem leerstring initialisiert werden.

    also danke an alle die darüber nachdenken bzw. -dachten.

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  3. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  4. Einfache Abfrage in COBOL/400 mit EXEC SQL
    By AS400-Anfänger in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 27-06-06, 13:18
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

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