代码世界我爱编程

Pro*Cobol如何访问DB2和Oracle数据库

2018-01-24  本文已影响15人  CodingCode

Pro*Cobol访问DB2和Oracle数据库的一个简单例子。

访问DB2

SAMPLE.sqb

$ cat SAMPLE.sqb
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.

       EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 USERNAME                  PIC X(010) VALUE "<USERNAME>".
       01 PASSWD                    PIC X(010) VALUE "<PASSWORD>".
       01 DBSTRING                  PIC X(020) VALUE "<DBNAME>".

       01 H-HOST-VARIABLE.
          02 H-S-VALUE              PIC X(10).
       EXEC SQL END DECLARE SECTION END-EXEC.

       EXEC SQL INCLUDE SQLCA END-EXEC.

       PROCEDURE DIVISION.
       BEGIN-PGM.
           DISPLAY "ENTRY OF SAMPLE".
           EXEC SQL
                CONNECT TO :DBSTRING user :USERNAME using :PASSWD
           END-EXEC.
           DISPLAY "SQLCODE: ", SQLCODE OF SQLCA.
           DISPLAY "CONNECTED TO DATABASE ", DBSTRING.

           EXEC SQL
                SELECT 'ABCD'
                  INTO :H-S-VALUE
                  FROM SYSIBM.SYSDUMMY1
           END-EXEC.
            
           DISPLAY "H-S-VALUE:", H-S-VALUE.
           DISPLAY "SQLCODE:  ", SQLCODE OF SQLCA.
        
*     *    EXEC SQL COMMIT END-EXEC.
*     *    EXEC SQL ROLLBACK END-EXEC.
           DISPLAY SQLERRMC.

           STOP RUN.

makefile

$ cat makefile

APPHOME=..
COBCPY=$(DB2DIR)/include/cobol_mf

all: SAMPLE SAMPLE.gnt

.SUFFIXES: .sqb .cbl .gnt
.PRECIOUS: %.cbl


.cbl.gnt:
        @case "${COB}" in \
                MF)       cob -ug $*.cbl -C "use($(APPHOME)/opt.dir)" -C "list($*.lst)" -C XREF -C SETTINGS;; \
                COBOL-IT) cobc -m -g -G -fmf-gnt $*.cbl -Wall -fixed -lcitextfh -t $*.lst -conf=$(APPHOME)/cit.conf;; \
                *)        echo "Cobol type ${COB} unknown"; exit 1;; \
        esac
        @echo ".cbl->.gnt Done"

# libdb2gmf/sqlgmf.o is generate from DB2 library, like
# ar -x $(DB2DIR)/lib64/libdb2gmf.a
# This should be a CIT bug, it cannot load static library libdb2gmf.a

SAMPLE: SAMPLE.cbl
        @case "${COB}" in \
                MF)       cob  -x -o SAMPLE SAMPLE.cbl -L$(DB2DIR)/lib64 -ldb2 -ldb2gmf ;; \
                COBOL-IT) cobc -v -x -o SAMPLE SAMPLE.cbl libdb2gmf/sqlgmf.o -L$(DB2DIR)/lib64 -ldb2 -ldb2gmf ;; \
                *)        echo "Cobol type ${COB} unknown"; exit 1;; \
        esac
        @echo ".cbl->.exe Done"


.sqb.cbl:
        db2 connect to <DBNAME> user <USERNAME> using <PASSWORD>
        db2 prep '$*.sqb' BINDFILE PACKAGE USING '$(notdir $<)' VERSION $(firstword $(shell echo `uname -n`:$(CURDIR)/'$<'|md5sum ))
        db2 bind '$*.bnd'
        @echo ".sqb->.cbl Done"

clean:
        -rm -rf c *.lst *.lis *.int *.idy *.so *.gnt *.o *.bnd *.cbl core.* SAMPLE

注意对于.gnt格式的文件不清楚如何运行,对于可执行程序则直接运行

$ ./SAMPLE
ENTRY OF SAMPLE
SQLCODE: +0000000000
CONNECTED TO DATABASE <DBNAME>            
H-S-VALUE:ABCD      
SQLCODE:  +0000000000

访问Oracle

SAMPLE.pco

$ cat SAMPLE.pco    
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.

            EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 USERNAME                  PIC X(010) VALUE "scott".
       01 PASSWD                    PIC X(010) VALUE "tiger".
       01 DBSTRING                  PIC X(020) VALUE "orcl".

       01 H-HOST-VARIABLE.
          02 H-S-VALUE              PIC X(10).
            EXEC SQL END DECLARE SECTION END-EXEC.

            EXEC SQL INCLUDE SQLCA END-EXEC.

       PROCEDURE DIVISION.

       BEGIN-PGM.
           DISPLAY "ENTRY OF SAMPLE".
                EXEC SQL
                    CONNECT :USERNAME
                       IDENTIFIED BY :PASSWD
                      USING :DBSTRING
                END-EXEC.
           DISPLAY "SQLCODE: ", SQLCODE OF SQLCA.
           DISPLAY "CONNECTED TO DATABASE ", DBSTRING.

                EXEC SQL
                SELECT 'ABCD'
                  INTO :H-S-VALUE
                  FROM DUAL
                END-EXEC.
            
           DISPLAY "H-S-VALUE:", H-S-VALUE.
           DISPLAY "SQLCODE:  ", SQLCODE OF SQLCA.
        
*     *         EXEC SQL COMMIT END-EXEC.
*     *         EXEC SQL ROLLBACK END-EXEC.
           DISPLAY SQLERRMC.

           STOP RUN.

makefile

$ cat makefile 

APPHOME=..

all: SAMPLE.gnt SAMPLE 

.SUFFIXES: .pco .cbl .gnt
.PRECIOUS: %.cbl

.cbl.gnt:
        @case "${COB}" in \
                MF)       cob -ug $*.cbl -C "use($(APPHOME)/opt.dir)" -C "list($*.lst)" -C XREF -C SETTINGS;; \
                COBOL-IT) cobc -m -g -G -fmf-gnt $*.cbl -Wall -fixed -lcitextfh -t $*.lst -conf=$(APPHOME)/cit.conf;; \
                *)                echo "Cobol type ${COB} unknown"; exit 1;; \
        esac
        @echo ".cbl->.gnt Done"

SAMPLE: SAMPLE.cbl
        @case "${COB}" in \
                MF)       cob  -x -o SAMPLE SAMPLE.cbl -L$(ORACLE_HOME)/lib/ $(ORACLE_HOME)/precomp/lib/cobsqlintf.o -lclntsh `cat $(ORACLE_HOME)/lib/sysliblist` ;; \
                COBOL-IT) cobc -x -o SAMPLE SAMPLE.cbl -L$(ORACLE_HOME)/lib/ $(ORACLE_HOME)/precomp/lib/cobsqlintf.o -lclntsh `cat $(ORACLE_HOME)/lib/sysliblist` ;; \
                *)                echo "Cobol type ${COB} unknown"; exit 1;; \
        esac
        @echo ".cbl->.exe Done"

.pco.cbl:
        procob MODE=ANSI INAME=$*.pco ONAME=$*.cbl
        @echo ".pco->.cbl Done"

clean:
        -rm -rf c *.lst *.lis *.int *.idy *.so *.gnt *.o *.bnd *.cbl *.cob core.* SAMPLE

对于MF格式的.gnt文件,可以Oracle提供的工具rtsora按照下面命令执行:

$ ${ORACLE_HOME}/bin/rtsora SAMPLE.gnt      
ENTRY OF SAMPLE
SQLCODE: +0000000000
CONNECTED TO DATABASE orcl                
H-S-VALUE:ABCD      
SQLCODE:  +0000000000

对于CIT格式的.gnt文件,不知道如何运行:

对于可执行程序则直接运行:

$ ./SAMPLE 
ENTRY OF SAMPLE
SQLCODE: +0000000000
CONNECTED TO DATABASE orcl                
H-S-VALUE:ABCD      
SQLCODE:  +0000000000
上一篇 下一篇

猜你喜欢

热点阅读