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