-
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
-
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.
-
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
-
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.
-
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
-
Je nach Dialekt kann "AS" auch schon mal entfallen.
-
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.
-
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
-
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
-
By schatte in forum NEWSboard Programmierung
Antworten: 19
Letzter Beitrag: 10-01-07, 11:32
-
By steven_r in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 08-08-06, 09:34
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 01-06-06, 09:43
-
By e_sichert in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 03-05-06, 10:47
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks