[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2006
    Beiträge
    4

    Question Cobol-Programm mit Embedded SQL (SELECT CASE)

    Hi,

    in dem og. Programm habe ich diverse SQL-Aufrufe, darunter 2 mit SELECT CASE, z. B.:

    EXEC SQL
    SELECT COUNT(*)
    ,CASE
    WHEN ARZNEIMITTEL = '2'
    THEN 1
    WHEN VERBANDMITTEL = '1'
    THEN 2
    WHEN HILFSMITTEL = '1'
    THEN 3
    ELSE 9
    END PRODUKTGRUPPE
    ,DIAETETIKUM
    ,ZUZAHLUNG
    FROM PZN_GKV_PREISE
    WHERE PZN = :VAR-PZN
    AND :VAR-DAT-ABGABE BETWEEN GUELTIG_VON
    AND NVL(GUELTIG_BIS,SYSDATE)
    GROUP
    BY ARZNEIMITTEL
    ,VERBANDMITTEL
    ,HILFSMITTEL
    ,DIAETETIKUM
    ,ZUZAHLUNG
    END-EXEC

    Das Select-Statement arbeitet für sich genommen richtig (beim Ausführen mit SQLPLUS). Ebenso, wenn ich es aus einer PL/SQL-Prozedur aufrufe.
    Beim Aufruf durch das Cobol-Programm jedoch erfolgt ein Abbruch mit "ORA-00905: missing keyword".

    Dasselbe passiert bei dem anderen Select-Statement mit CASE. Ohne CASE im SELECT gibt es bei dem Cobol-Programm aber kein Problem.

    Hat jemand eine Erklärung dafür?

    COBOL II (IBM)
    Oracle 9.2
    Mainframe/Betriebssystem z/OS

    Mfg
    Klaus

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das betrifft zwar nicht dieses Forum (AS/400) aber ich denke der Fehler ist folgender:

    Der Case-Ausdruck PRODUKTGRUPPE enthält weder eine Group-Funktion (SUM, AVG, MIN, ...) noch ist er Bestandteil der Group-By-Klausel.
    Für eine der beiden musst du dich aber entscheiden, da SQL sonst nichts mit dem Case anfangen kann.

    Im Dialog mag SQLPLUS das vielleicht ignorieren und irgendwas annehmen, aber embedded SQL muss fehlerfreie SQL's einbetten.
    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
    Apr 2006
    Beiträge
    4

    Cobol-Programm mit Embedded SQL (SELECT CASE)

    Hallo,
    vielen Dank für die Antwort, aber:

    Das GROUP BY ist erforderlich wegen der Gruppenfunktion COUNT(*). Dabei werden jedoch nur die Einzelspalten akzeptiert, nicht die PRODUKTGRUPPE des CASE.

    Dieser Zusammenhang macht sich auch in anderen Fällen bemerkbar, in denen das SQL-Statement aber sowohl allein als auch im Cobol-Programm funktioniert (z.B. wenn ich das CASE durch die DECODE-Funktion ersetze).

    Auch der Pre-Compiler beanstandet ja kein einziges SQL-Statement, d.h. die SQL-Syntax ist in Ordnung. Der Fehler tritt erst bei der Programmausführung mit dem ersten EXEC-Aufruf des SELECT CASE auf!

    MfG
    Klaus

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Da scheint der Syntaxchecker des Compilers ggf. ein Problem zu haben.
    Bei Ausdrücken in Group-by-Select's muss entweder
    - eine Gruppierungsfunktion (sum, count, min, max, ...) verwendet werden
    oder
    - der gesamte Ausdruck in der Group-Clausel wiederholt werden.
    Eine Referenz auf den dynamischen Spaltennamen funktioniert da 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

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Hallo Klaus!

    Vielleicht fehlt nur irgendwo das Schlüsselwort AS, z.B. zwischen END und PRODUKTGRUPPE, so ähnlich wie in diesem Beispiel?

    Viele Grüße
    Jürgen

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Je nach Dialekt kann "AS" auch schon mal entfallen.
    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
    Jun 2006
    Beiträge
    2
    Sie können Schwierigkeit finden, wenn Sie meinen Pfosten lesen, wie ich von Hong-Kong und vom Verwenden von von on-line-Übersetzung bin Ich habe das gleiche Problem in meinem COBOL Programm, wenn ich die FALL-VORWÄHLER verwende. Jedoch finde ich die Lösung jetzt Sie können dynamischen sql versuchen, den ich Ihnen mein Argument für Ihre Bezugshoffnung zeige, sie helfen kann.

  8. #8
    Registriert seit
    Jun 2006
    Beiträge
    2
    Zitat Zitat von km198
    Sie können Schwierigkeit finden, wenn Sie meinen Pfosten lesen, wie ich von Hong-Kong und vom Verwenden von von on-line-Übersetzung bin Ich habe das gleiche Problem in meinem COBOL Programm, wenn ich die FALL-VORWÄHLER verwende. Jedoch finde ich die Lösung jetzt Sie können dynamischen sql versuchen, den ich Ihnen mein Argument für Ihre Bezugshoffnung zeige, sie helfen kann.
    INITIALIZE S-FTARSDT-SQL-STAT

    STRING
    "SELECT DISTINCT CASE "
    "WHEN FT.ARS_DT IS NULL THEN "
    "( SELECT FTB.ARS_DT FROM CI_FT FTB "
    "WHERE FTB.SIBLING_ID = "
    "( SELECT ADJ.XFER_ADJ_ID FROM CI_ADJ ADJ "
    "WHERE ADJ.ADJ_ID = FT.SIBLING_ID "
    "AND ADJ.ADJ_STATUS_FLG = '50' ) ) "
    "WHEN FT.ARS_DT > TRUNC(FT.FREEZE_DTTM) THEN "
    "TRUNC(FT.FREEZE_DTTM) "
    "ELSE FT.ARS_DT "
    "END CASE "
    "FROM CI_FT FT "
    "WHERE FT.FT_TYPE_FLG IN ('AD', 'PS') "
    "AND FT.FREEZE_SW='Y' "
    "AND FT.SA_ID = '"
    SA-ID OF S-FT-IN-DATA
    "' AND ((FT.ARS_DT BETWEEN '"
    BEGIN-DT OF S-FT-IN-DATA
    "' AND '"
    PROCESS-DT OF S-FT-IN-DATA
    "') OR (FT.ARS_DT IS NULL "
    "AND FT.PARENT_ID LIKE 'X%')) "
    "ORDER BY CASE ASC"
    INTO S-FTARSDT-SQL-STAT
    END-STRING

    EXEC SQL

    PREPARE SQLSTMTFT FROM :S-FTARSDT-SQL-STAT

    END-EXEC

    EXEC SQL

    DECLARE IACXSFTCSR CURSOR FOR SQLSTMTFT

    END-EXEC

  9. #9
    Registriert seit
    Apr 2006
    Beiträge
    4
    Hi km198,

    thanks for your solution.

    In the meantime my program is finished in another way, but in the future I'll try to use dynamic sql.

Similar Threads

  1. Programmbibliothek in einem Cobol oder CL Programm ermitteln
    By schatte in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 10-01-07, 11:32
  2. SQL Case von mehreren Dateien
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 08-08-06, 09:34
  3. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  4. Character verbinden in Embedded SQL
    By e_sichert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-05-06, 10:47
  5. Satzanzahl Select (embedded SQL)
    By Schorsch in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-09-05, 15:22

Berechtigungen

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