[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Nov 2011
    Beiträge
    86

    SQL-Error -312

    Hallo zusammen,

    ich habe folgenden Code:
    Code:
     dcl-s strech     zoned(15:0);    
    sqlstmt = 'select sum(strech) +
                   into :strech +
                   from rgfussp +
                   where (' + %trim(getRechnungsnummern()) + ') and +
                   rechjj = ' + %char(DS_rgkopfp.rechjj);
    
                   exec sql
                   prepare daten from :sqlstmt;
    
                   exec sql
                   execute daten;
    Im sqlstmt steht im Debugger
    Code:
    select sum(strech) into :strech from rgfussp where (rechnr7 = 2040863 or rechnr7 = 2040864 or rechnr7 = 2040865 or rechnr7 = 2040908 or rechnr7 = 2041190) and rechjj = 15
    Beim "prepare" kommt der sqlcode -312 zum Vorschein. Die Variable strech ist entweder nicht definiert oder kann nicht verwendet werden. Das verstehe ich aber nicht.
    Das SQL an sich funktioniert. Das Problem liegt an der Variablen.
    Bitte um Hilfe.

    Vielen Dank vorab!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    Hostvariablen lassen sich leider nicht in einer Variablen "kapseln".
    Wenn du den SQL dynamisch benötigst dann musst du leider einen Cursor for Statement definieren und die Daten dann per OPEN/FETCH/CLOSE lesen.
    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
    Aug 2001
    Beiträge
    2.875
    Wenn nur ein Datensatz zurückkommt, ist auch beim dynamischen SQL kein Cursor notwendig.
    VALUES INTO kann dynamisch aufbereitet werden.

    Code:
    MySQLStmt = 'VALUES (dynamischAufbereitetesSelectStatement) into ?';
    Exec SQL Prepare DynSQL From :MySQLStmt;
    
    Exec SQL Execute DynSQL Using :Strech;
    Variablen in (embedded) SQL-Programmen, sollten niemale mit SQL oder SQL beginnen. Diese hat IBM für sich reserviert für den Precompiler reserviert.
    Auch wenn diese Variablen heute keine Probleme machen, könnte IBM im nächsten Technology Referesh eine Variable mit dem gleichen Namen in die SQLCA oder SQLDA integrieren. Das beste was dann passieren könnte ist, dass Dein Programm nicht mehr kompliert werden kann. Viel schlimmer wäre, wenn dadurch irgendwelche abstrutsen Ergebnisse zustande kommen würden.

    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

  4. #4
    Registriert seit
    Nov 2011
    Beiträge
    86
    Vielen Dank für die Antworten und Tipps!

    Wenn ich die Lösung von Birgitta einbaue, bekomme ich an der "Prepare"-Stelle den SQLCODE -199

    In der Variablen MySQLStmt steht:
    Code:
    VALUES INTO select sum(strech) from rgfussp where (rechnr7 = 2040863 or rechnr7 = 2040864 or rechnr7 = 2040865 or rechnr7 = 2040908 or rechnr7 = 2041190) and rechjj = 15 into ?

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Hallo,
    ich würde ja statt der OR Orgie lieber das IN-Statement benutzen, ist kürzer und lesbarer.

    GG

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    Schau dir das Beispiel an:
    Dein Select bis vor into gehört in Klammern.
    Und es hängt vom Release ab, ab wann die Values-Anweisung klappt.

    Schön wäre es, wenn du den Fehlertext zu deinem SQL-Code mit liefern könntest.
    Steht entweder im Joblog oder in der MSGF QSQLMSG mit "SQLxxxx".
    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
    Mar 2002
    Beiträge
    5.287
    ... Parameter Markers dürfen nur dort benutzt werden, wo auch ein Literal stehen dürfte. select ... into ? geht also nicht, alleine schon wegen der Typbindung von SQL. Stattdessen sollte man die Werte in der where Klausel durch Parameter Marker besetzen. Also. select ... where feld = ? statt den Wert reinzubasteln, das ist dann stabiler.

    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/

  8. #8
    Registriert seit
    Nov 2011
    Beiträge
    86
    Vielen Dank für die vielen Hinweise. Habe es jetzt hinbekommen. Birgitta's Lösung war fast gut. Lediglich das INTO hinter VALUES habe ich rausgenommen. Dann funktioniert alles wie gewünscht!

Similar Threads

  1. QUSRSYS *ERROR
    By PS in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 18-02-03, 20:47
  2. QUSRSYS geht auf ERROR
    By UGildehaus in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-01-03, 18:48
  3. Error SQL7905
    By CZE425 in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 13-02-02, 15:40
  4. SQL-Error
    By Stefan_R in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 24-10-01, 10:17
  5. SQL-Error
    By Stefan_R in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 17-09-01, 14:23

Berechtigungen

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