PDA

View Full Version : Aufruf SQLCBL aus CBL-Programm



Cobolaner
13-05-11, 07:45
Hallo Zusammen,
ein Cobol-Programm (Subfile), mit 5 Eingabezeilen, soll je Zeile ein SQLCBL aufrufen.
Nach dem 1. Aufruf des SQLCBL-Pgm's kommt beim REWRITE auf die SFL die Nachricht:
Datensatzname erforderlich
(der Formatname ist aber festangegeben bei dem REWRITE)

die Zeilen 2 -4 wurden nicht geprüft und bei drücken einer Taste bricht das CBL ab, mit: Nachricht MCH3601

Wird das SQLCBL-Pgm NICHT aufgerufen, funktioniert das CBL-Programm wie gewünscht.
Hat jemand vielleicht eine Idee, warum das CBL-PGM abbricht??
Besten Dank

Fuerchau
13-05-11, 08:21
Das läßt sich wohl nur richtig mit dem Debugger überprüfen.
Die Frage ist, was macht das Unter-CBL ?
Zu bedenken ist ja, dass das Unter-CBL je nach Return-Modus (GOBACK bzw. EXIT PROGRAMM) nicht neu initialisiert wird, SQL-Cursor somit offen bleiben usw.
Der MCH3601 deutet ja auf fehlende Initialisierung hin.
Stochern im Nebel mag ich am liebsten :).

Cobolaner
13-05-11, 08:29
Hallo,
nach Aufruf des SQLCBL-Pgm kommen diese Meldungen:
ODP erstellt.
Blockung für Abfrage.
Cursor CURSOR110 eröffnet.
Datenumsetzung bei Anweisung FETCH oder eingebetteter Anweisung SELECT erforderlich.
1 Zeilen von Cursor CURSOR110 abgerufen.
Zeile für CURSOR110 nicht gefunden.
Offener Datenpfad (ODP) gelöscht.
Cursor CURSOR110 wurde geschlossen.
Verbindung zur relationalen Datenbank DBH910AE01 beendet.
SQL-Cursor geschlossen

ich habe noch etwas gefunden: SQL5065 Zugriffsplan nicht gefunden.

gruß Cobolaner

B.Hauser
13-05-11, 08:48
Wenn Du die Verbindung zur Datenbank trennst, musst Du beim nächsten Aufruf die Verbindung auch wieder herstellen.

Mir stellt sich die Frage, warum Du die Verbindung zur Datenbank überhaupt beendest!


SQL5065 Zugriffsplan nicht gefunden.
Das ist kein Problem. Der Zugriffsplan wird immer validiert oder sofern kein Zugriffsplan vorhanden ist neu erstellt.

Birgitta

Cobolaner
13-05-11, 08:55
Hallo Birgitta,

die Frage stellt sich mir auch.

Wenn das SQLCBL beendet ist, kommt die Meldung.

Wer trennt schon freiwillig eine Verbindung ??

Kann das mit SQL5065 zusammen hängen?

Gruß Cobolaner

Fuerchau
13-05-11, 09:18
Wichtig ist, wie du dein Programm verläßt.
GOBACK -> keine erneute Initialisierung
EXIT PROGRAM -> Programm wird auch deaktiviert

Zusätzlich ggf.
EXEC SQL SET OPTION CLOSQLCSR=*ENDACTGRP (oder *ENDJOB)
END-EXEC

verwenden.

Cobolaner
13-05-11, 09:27
Nein, das wa es leider auch nicht.

GOBACK ist vorhanden und CLOSQLCSR habe ich beim Kompilieren angegeben.

Fuerchau
13-05-11, 12:34
Dann ist das ein Problem der COBOL-Rununit.
Soweit ich das gesehen habe, wird die Verbindung zur DB getrennt, wenn es die höchste Aufruf-Ebene einer SQL-Verbindung ist.
Dies kann man nur verhindern, wenn das übergordnete CBL-Programm auch ein SQLCBL ist, so dass dort bereits der implizite Connect zur DB erfolgt.

Was du noch probieren kannst ist an Stelle des Goback ein
EXIT PROGRAM AND CONTINUE RUN UNIT

In diesem Fall bleibt das Cobol aktiv.
Wenn das alleine nicht hilft, muss das SQLCBL ggf. in eine eigene ACTGRP, so dass es als eigene Rununit gestartet wird. Mittels obige Exits bleibt diese dann bis Job-Ende oder RCLACTGRP aktiv.

COBOL arbeitet diesbezüglich erheblich anders als RPG.

Um ein CBL-Unterprogramm definitiv rauszuschmeißen gibt es noch die Anweisung CANCEL.