PDA

View Full Version : Cobol embedded SQL



Seiten : [1] 2

wolfinho
18-09-07, 15:16
Hallo,

in einem Cobol-Programm möchte ich über embedded SQL (Cursorverarbeitung) eine DB2-Tabelle auslesen. Leider meckert mir der Pre-Compiler an meinen numerischen Host-Variablen rum. Fehler: SQL0312 30 266 Position 25 Variable DAT-EINGEFUEGT nicht definiert oder
nicht verwendbar.
Alle Character-Host-Variablen akzeptiert er. Woran liegt das ?

Muss ich die Host-Variablen mit EXEC SQL definieren ? Ich denke nicht, oder ?

Anmerkung: Die Cursorverarbeitung läuft Field-by-Field, also nicht Select *. Cobol-Programm ist vom Typ sqlcbl

Vorab vielen Dank für eure Mühe.

wolfinho

Fuerchau
18-09-07, 15:36
Im Gegensatz zu RPG muss in COBOL jede SQL-Hostvariable bekannt gemacht werden:

exec sql begin declare section end-exec
01 Hostvar.
:
:
77 Hostvar2 ...
:
exec sql end declare section end-exec

wolfinho
19-09-07, 09:14
vielen Dank für die Antwort. Leider funktioniert das Ansprechen der non-Character-Variablen immer noch nicht.

Das Programm ist vom Typ SQLCBL und wird wie folgt umgewandelt:
CRTSQLCBL PGM(*BIBNAME*/TESTSQL1) SRCFILE(*BIBNAME*/QLBLSRC) SRCMBR(TESTSQL1) REPLACE(*YES) OPTION(*LSTDBG)

Der Pre-Compiler bringt folgende Meldung:
SQL0312 Position 25 Variable B010KANST nicht definiert oder nicht verwendbar.

Ich habe schon etliche Sachen versucht und komme einfach nicht weiter. Vielleicht hilft der Anhang (Cobol-Programm).

Fuerchau
19-09-07, 09:22
Der Anhang hat leider nicht geklappt.

Wie definierst du die Variable denn ?
Liegt sie zwischen "begin declare" und "end declare" ?

Ist sie ggf. extern definiert ?
Soweit ich weiß, wird COPY-DD... vom Precompiler nicht aufgelöst sondern nur normale Copy's.

wolfinho
19-09-07, 09:25
Da das hochladen bei mir nicht funktioniert hier das Programm:



000100070919 PROCESS APOST
000101070919 IDENTIFICATION DIVISION.
000102070919 PROGRAM-ID. TESTSQL1.
000131070919 ENVIRONMENT DIVISION.
000132070919 CONFIGURATION SECTION.
000133070919 SOURCE-COMPUTER. IBM-AS400.
000134070919 OBJECT-COMPUTER. IBM-AS400.
000135070919 SPECIAL-NAMES. REQUESTOR IS WORK-STATION
000136070919 I-O-FEEDBACK IS SYSTEM-FEEDBACK.
000137070919 INPUT-OUTPUT SECTION.
000138070919 FILE-CONTROL.
000151070919 DATA DIVISION.
000152070919 FILE SECTION.
000160070919 WORKING-STORAGE SECTION.
000167070919 ************************************************** **************
000168070919 * SYSTEM-FEEDBACK FÜR I-O-OPERATIONEN
000169070919 ************************************************** **************
000170070919 *
000171070919 01 IO-INFORMATIONEN.
000172070919 02 GEN-I-O-AREA PIC X(144).
000173070919 02 IO-FEEDBACK PIC X(100).
000174070919 02 WS-FEEDBACK REDEFINES IO-FEEDBACK.
000175070919 03 AKTUELLE-ZEILE PIC S9(4) COMP-4.
000176070919 03 AKTUELLE-SEITE PIC S9(9) COMP-4.
000177070919 * AKTUELLE SUBFILE-SATZ-NUMMER
000178070919 03 SFL-REL-NBR PIC S9(4) COMP-4.
000179070919 * SUBFILE-SATZ-NUMMER DES OBERSTEN SATZES IN AKTUELLER ANZEIGE
000180070919 03 SFL-TOP-NBR PIC S9(4) COMP-4.
000181070919 * AKTUELLE ANZAHL SÄTZE IN AKTUELLER SUBFILE
000182070919 03 SFL-NBR-RCD PIC S9(4) COMP-4.
000183070919 02 DB-FEEDBACK REDEFINES IO-FEEDBACK.
000184070919 03 FILLER PIC X(030).
000185070919 * RELATIVE SATZNUMMER DES ZULETZT GELESENEN DATENBANKSATZES
000186070919 03 DB-RRN PIC 9(09) COMP-4.
000188070919 ************************************************** **************
000189070919 * DB2-Systeminformationen
000190070919 ************************************************** **************
000191070919 *
000192070919 EXEC SQL INCLUDE SQLCA END-EXEC.
000195070919
000196070919 ************************************************** *********** ***
000197070919 * DB2-Cursor
000198070919 ************************************************** **************
000199070919 *
000200070919
000201070919 EXEC SQL
000202070919 DECLARE C010AD CURSOR FOR
000203070919 SELECT
000204070919 B010NAME,
000205070919 B010KANST,
000206070919 B010NATION
000207070919 FROM BBBLIB/BBB010AD
000208070919 WHERE
000209070919 B010RZBK = "0125"
000210070919 AND B010KUNR < "0000010000"
000211070919 END-EXEC.
000212070919
000213070919
000214070919
000215070919 ************************************************** **************
000216070919 * DB2-Host-Variablen
000217070919 ************************************************** **************
000218070919 *
000219070919 EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000220070919
000221070919 01 HOST-VARS.
000222070919
000223070919 05 BBB010AD-HOST.
000224070919 10 B010NAME PIC X(32).
000225070919 10 B010KANST PIC 9(01).
000226070919 10 B010NATION PIC S9(5) COMP-3.
000234070919
000235070919 EXEC SQL END DECLARE SECTION END-EXEC.
000236070919
000237070919
000277070919 /************************************************** **************
000278070919 *
000279070919 * Linkage Section
000280070919 *
000281070919 ************************************************** ***************
000282070919
000283070919 LINKAGE SECTION.
000284070919
000285070919 *
000286070919 /************************************************** **************
000287070919 *
000288070919 * Programm - Steuerroutine
000289070919 *
000290070919 ************************************************** ***************
000291070919
000292070919 PROCEDURE DIVISION.
000293070919
000294070919
000295070919 STEUERUNG SECTION.
000296070919
000297070919 STEUERUNG-01.
000298070919
000299070919 EXEC SQL
000300070919 WHENEVER SQLERROR GOTO SQL-FEHLER
000301070919 END-EXEC.
000302070919
000303070919 PERFORM PGM-START
000304070919
000305070919 PERFORM PGM-LOGIK
000306070919
000307070919 PERFORM PGM-ENDE.
000308070919
000309070919 STEUERUNG-99.
000310070919
000311070919 EXIT.
000312070919
000313070919
000314070919 *
000315070919 ************************************************** ***************
000316070919 *
000317070919 * Programmstart
000318070919 *
000319070919 ************************************************** ***************
000320070919
000321070919 PGM-START SECTION.
000322070919
000323070919 PGM-START-01.
000324070919
000336070919 CONTINUE
000337070919
000338070919 PGM-START-99.
000339070919
000340070919 EXIT.
000341070919
000342070919 *
000343070919 ************************************************** ***************
000344070919 *
000345070919 * Programmlogik
000346070919 *
000347070919 ************************************************** ***************
000348070919
000349070919 PGM-LOGIK SECTION.
000350070919
000351070919 PGM-LOGIK-01.
000352070919
000353070919 EXEC SQL
000354070919 OPEN C010AD
000355070919 END-EXEC.
000356070919
000357070919 MOVE ZERO TO SQLCODE
000359070919
000360070919 PERFORM UNTIL SQLCODE = 100
000361070919
000362070919 EXEC SQL
000363070919 FETCH C010AD
000364070919 INTO
000365070919 :B010NAME,
000366070919 :B010KANST,
000367070919 :B010NATION
000386070919 END-EXEC
000387070919 DISPLAY "BBB010AD: " BBB010AD-HOST
000388070919 END-PERFORM
000389070919
000390070919 EXEC SQL
000391070919 CLOSE C010AD
000392070919 END-EXEC.
000393070919
000394070919 PGM-LOGIK-99.
000395070919
000396070919 EXIT.
000397070919
000398070919 *
000399070919 ************************************************** ***************
000400070919 *
000401070919 * Programmende
000402070919 *
000403070919 ************************************************** ***************
000404070919
000405070919 PGM-ENDE SECTION.
000406070919
000407070919 PGM-ENDE-01.
000408070919
000413070919 GOBACK.
000414070919
000415070919 PGM-ENDE-99.
000416070919
000417070919 EXIT.
000418070919
000419070919 *
000420070919 ************************************************** ***************
000421070919 *
000422070919 * Fehlerhandling bei SQL-Fehlern
000423070919 *
000424070919 ************************************************** ***************
000425070919
000426070919 SQL-FEHLER SECTION.
000427070919
000428070919 SQL-FEHLER-01.
000429070919
000430070919 DISPLAY "SQL-FEHLER IN TSTSQL1: " SQLCA.
000431070919
000432070919 SQL-FEHLER-99.
000433070919
000434070919 EXIT.
000435070919

Fuerchau
19-09-07, 09:30
Tja, da haben wir es doch schon.
Der Precompiler geht sequentiell vor, d.h., dass Variablen VOR ihrer ersten Verwendung definiert werden müssen.

Wo ich mir nicht ganz so sicher bin, aber das kommt auf einen Versuch halt an, gehören SQL-Cursor-Deklarationen ggf. in die Procedure Division (ich habs jedenfalls immer so gehalten, diese vor dem Open zu deklarieren).

Fuerchau
19-09-07, 09:32
Sorry, nicht genau gelesen:

B010KANST ist ohne Vorzeichen, dies wird bei SQL nicht unterstützt.

Definiere die Variable mit S9(01) !

wolfinho
19-09-07, 09:39
ich habe die Definition des Cursors jetzt einmal in die Procedure division in die section PGM-LOGIK SECTION. direkt vor dem open aufgenommen. bekomme aber leider noch den gleichen fehler.

dass der declare nach der definition stehen muss ist wohl richtig, aber ich glaube der cursor kann auch in der working-storage section definiert werden. so war es zumindet auf dem großrechner (zos), auf dem ich noch vor 9 monaten programmiert habe.

wolfinho
19-09-07, 09:43
tatsächlich. es lag an dem vorzeichen. jetzt funktioniert es. Vielen vielen Dank für deine hilfe. ich wäre da nie drauf gekommen.

aber noch eine frage am rande, da wir planen über db2 connect auf entfernte systeme zuzugreifen. brauch der db2-precompiler eigentlich informationen der in den embedded sql verwendeten tabellen ?

wolfinho
19-09-07, 10:04
Irgendwie scheint der Pre-Compiler sich Informationen über die DB2-Tabelle zu holen, aber wenn er diese Informationen nicht findet, scheint es auch zu funktionieren, da ich bei der umwandlung eines cobol-programmes mit db2-connect und einem zugriff auf eine fremde db2-tabelle nur folgenden hinweis bekomme:

SQL1103 Position 24 Spaltendefinitionen für Tabelle VADWX027 in T0V nicht gefunden.


Ich denke, das müßte dann so funktionieren.

Nochmals vielen Dank für Deine Hilfe.

Wolfinho