[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    May 2007
    Beiträge
    29

    Cobol embedded SQL

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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
    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
    May 2007
    Beiträge
    29

    verzweifelt

    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).

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    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
    May 2007
    Beiträge
    29

    fehlender Anhang

    Da das hochladen bei mir nicht funktioniert hier das Programm:

    Code:
    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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).
    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
    Feb 2001
    Beiträge
    20.696
    Sorry, nicht genau gelesen:

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

    Definiere die Variable mit S9(01) !
    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

  8. #8
    Registriert seit
    May 2007
    Beiträge
    29
    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Zur Umwandlungszeit benötigst du natürlich eine korrekt definierte Tabelle (war bei mir bisher zumindest so).

    Mit embedded SQL gibts da allerdings noch einen Haken.

    Zur Laufzeit musst du einen Connect zum Zielsystem durchführen.
    Ein Programm kann jedoch nur 1 Verbindung aufrecht halten.
    Machst du einen Connect, wird deine loakle DB disconnected, dann kannst du auf den Host zugreifen. Mittels "Connect reset" wird die Hostverbindung getrennt und wieder lokal verbunden.

    Ja nach Datenvolumen verlangsamt dies drastisch die Laufzeit.
    Zusätzlich funktioniert das Ganze gar nicht, wenn deine lokale DB unter Commit läuft.
    Vor dem Connect zum Host musst du nämlich erst mal einen Commt/Rollback setzen, da sont der Connect fehlschlägt.

    Lösung:
    Du musst lokale und ferne Zugriff über 2 getrennte Programme UND Aktivierungsgruppen durchführen.
    Hierzu eignet sich am besten dann SQLCBLLE, da du nur hier ACTGRP's angeben kannst.

    Zwischen den Programmen kannst du dann per "CALL ... using" Daten austauschen.

    2. Problem
    SQLCBL erstellt intern SQLPKG's.
    Um nun auf den Remote-Host zuzugreifen musst du das SQLPKG per CRTSQLPKG auf dem Zielhost erstellen.
    Dies ist mit jeder Änderung des Programmes wieder erforderlich.
    Unterstützt der Zielhost keine SQLPKG's kann das Programm nicht laufen.

    Umgehung ist hier dann eine DDMF, die dann allerdings nicht mit SQL verarbeitet werden kann.
    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

  10. #10
    Registriert seit
    May 2007
    Beiträge
    29

    Vorstellungen

    Hallo,

    vielen Dank für Deine Ausführungen. Meine Vorstellungen gingen dahin, daß ich innerhalb des Programmes mit DB2-Connect die entfernte Datenbank auslese und diese dann über das Dateisystem auf die i5 schreibe. Da ja aber hinter jeder Datei auf der i5 sich eine DB2-Tabelle verbirgt, bin ich mir nicht sicher ob ich vor jedem schreiben ein connect reset absetzen muss. Eigentlich müssten doch die Dateien auf der i5 die Verbindung zu dem Programm noch haben, da der Connect doch nur die embedded-SQL-Statements betrifft, oder ?

    Wenn meine Vorstellungen nicht ganz falsch sind, habe ich nur noch das Problem mit dem SQL-Package, welches ja auch auf dem entfernten System zur Verfügung stehen muss.

    Ich hoffe ich liege nicht ganz falsch mit meinen Vorstellungen.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Wenn ich das also richtig verstehe, greifst du auf lokale Tabellen nicht mit SQL zu ?
    Wenn dem so ist, kannst du natürlich mit Connect zum Host verbinden und lokal mit Read/Write-Methoden arbeiten.
    Arbeitest du allerdings auch lokal mit SQL kommst du um einen Connect Host/Connect Reset nicht herum oder du machst eben 2 Programme daraus.

    Ob deine SQL's funktionieren, kannst du auch per STRSQL und Connect ausprobieren.

    Per WRKRDBDIRE musst du nur die Zieldatenbank definieren.

    Im CRTCBLSQL kannst du bereits mit RDB(Hostname) die Ziel-DB angeben, so dass deine SQL's gegen den Host geprüft werden und ggf. das SQLPKG direkt erstellt wird.

    In der Quelle kannst du alternativ mit

    set options rdb=Host

    das Ziel angeben. Es gibt, wie immer, viele Wege zur Anwendung.
    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

  12. #12
    Registriert seit
    May 2007
    Beiträge
    29
    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.

Similar Threads

  1. Embedded SQL in VARPG
    By Squall in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 18-10-06, 12:01
  2. RPG mit Embedded SQL, JOIN ..
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 18-06-06, 12:14
  3. Cobol-Programm mit Embedded SQL (SELECT CASE)
    By klausgkv in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 08-06-06, 13:47
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Character verbinden in Embedded SQL
    By e_sichert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-05-06, 10:47

Berechtigungen

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