cobol 上的外部存储过程 db2
Posted
技术标签:
【中文标题】cobol 上的外部存储过程 db2【英文标题】:external stored procedure db2 on cobol 【发布时间】:2017-11-09 07:31:32 【问题描述】:我想问一下在 cobol z/os 上调用外部存储过程 这是我的代码,存储过程代码
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. SPROC02.
AUTHOR. AESANJA.
DATE-WRITTEN. 19 OKT 2017.
DATE-COMPILED.
DATA DIVISION.
WORKING-STORAGE SECTION.
*************************************************************
*INCLUDE SQLCA ITU SQL COMMUNICATION AREA *
*SETIAP SELESAI MENJALANKAN SQL STATEMENT DAN SELESAI *
*NILAI AKAN BERUBAH *
*************************************************************
EXEC SQL
INCLUDE SQLCA
END-EXEC.
*************************************************************
*INCLUDE DCLGEN NYA YANG DIGUNAKAN UNTUK AKSES DATABASE *
*MEMUNGKIKAN PROGRAM MELIHAT STRUKTUR TABLE DARI DATABASE *
*************************************************************
EXEC SQL
INCLUDE DAAVACDC
END-EXEC.
************************************************************
01 SP-SQLCODE PIC 9(9).
01 SP-SQLSTATE PIC 9(9).
LINKAGE SECTION.
01 BRANCH PIC X(07).
01 ACCTNO PIC X(11).
01 AVAILABLE PIC X(01).
01 ADDTS PIC X(26).
01 ADDUSER PIC X(08).
01 ADDPROGRAM PIC X(08).
01 UPDTS PIC X(26).
01 UPDUSER PIC X(08).
01 UPDPROGRAM PIC X(08).
01 OUTCODE PIC S9(09) USAGE BINARY.
PROCEDURE DIVISION USING BRANCH ,
ACCTNO ,
AVAILABLE ,
ADDTS ,
ADDUSER ,
ADDPROGRAM,
UPDTS ,
UPDUSER ,
UPDPROGRAM,
OUTCODE.
MAIN-PROC.
EXEC SQL
SELECT *
INTO :BRANCH ,
:ACCTNO ,
:AVAILABLE ,
:ADDTS ,
:ADDUSER ,
:ADDPROGRAM,
:UPDTS ,
:UPDUSER ,
:UPDPROGRAM
FROM DAVACV0
WHERE AVAC_BRANCH = :BRANCH
AND AVAC_ACCT_NO = :ACCTNO
END-EXEC.
MOVE SQLCODE TO OUTCODE.
MAIN-PROC-RETURN.
GOBACK.
然后这是我的 JCL 来预编译、编译、链接和绑定存储过程
//SPROCJCL JOB (999),CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1),NOTIFY=&SYSUID, JOB09854
// REGION=4M
//JOBLIB DD DSN=DB2DEV.DSNUAT2.SDSNEXIT,DISP=SHR
// DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
//*--------------------------------------------------------------------*
//STEP01 EXEC DSN2HCOB,MEM=TEMPNAME,USER='CISUSER',
// PARM.PC='HOST(IBMCOB),APOST,APOSTSQL,SOURCE,XREF',
// PARM.COB=('OBJECT,APOST,MAP,XREF,NONUM,OFF,FLAG(I,E),TRUNC(BIN)', X
// 'RENT,RES,LIB,NODYNAM'),
// PARM.LKED='RENT,REUS,LIST,XREF,LET,AMODE=31'
//*PLACE THE DCLGEN DSN
//PC.SYSLIB DD DSN=LCM.MNI.BCA.P.COPY,DISP=SHR
//*PLACE LOAD DBRMLIB
//PC.DBRMLIB DD DSN=IBS.BCA.DEV.DBRMLIB(SPROC02),DISP=SHR
//*PLACE THE SOURCE CODE OF STORED PROCEDURE
//PC.SYSIN DD DSN=AESANJA.LEARN.DB2(SPROC02),DISP=SHR
//*--------------------------------------------------------------------*
//*COPY BOOK OF THE DATA
//COB.SYSLIB DD DSN=LCM.MNI.BCA.P.COPY,DISP=SHR
//*--------------------------------------------------------------------*
//LKED.SYSLIB DD DSN=SYS1.CEE.SCEELKED,DISP=SHR
// DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
//LKED.SYSLMOD DD DSN=AESANJA.LEARN.LOAD(SPROC02),DISP=SHR
//LKED.SYSIN DD *
INCLUDE SYSLIB(DSNALI)
MODE AMODE(31) RMODE(ANY)
//*--------------------------------------------------------------------*
//SQLBIND PROC
//BIND EXEC PGM=IKJEFT01,DYNAMNBR=20
//DBRMLIB DD DSN=IBS.BCA.DEV.DBRMLIB,DISP=SHR
//STEPLIB DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSTSIN DD DDNAME=SYSTSIN
// PEND
//STEP2 EXEC SQLBIND
//****************************************************************
//* UBAH XXXXXXXX MENJADI NAMA PROGRAM
//****************************************************************
//BIND.SYSTSIN DD *
DSN SYSTEM(DSN1)
BIND PACKAGE(DPB_COLLID) -
MEMBER(SPROC02) -
ACT(REP) ISO(UR) ENCODING(EBCDIC) -
OWNER(CISUSER)
END
DSN SYSTEM(DSN1)
BIND PLAN(SPROC02) -
OWNER(CISUSER) -
PKLIST(DPB_COLLID.SPROC02) -
RETAIN -
DYNAMICRULES(BIND) -
VALIDATE(BIND) -
ISOLATION(CS) -
ACQUIRE(USE) -
RELEASE(COMMIT) -
EXPLAIN(YES)
END
然后我的 JCL 用于在系统表中定义存储过程
//CREASTPR JOB ,,CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),TIME=1440, JOB15600
// NOTIFY=&SYSUID,REGION=4M
//**********************************************************************
//* CREATE STORED PROCEDURE *
//**********************************************************************
//JOBLIB DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
// DD DSN=AESANJA.LEARN.LOAD,DISP=SHR
//STEP1 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DSN1)
RUN PROGRAM(DSNTIAD) PLAN(DSNTIAD) -
LIB('DSNBCA.RUNLIB.LOAD')
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSIN DD *
SET CURRENT SQLID='CISUSER';
CREATE PROCEDURE CISUSER.SP02KE02
(INOUT BRANCH DECIMAL(7) ,
INOUT ACCTNO DECIMAL(11),
OUT AVAILABLE CHAR(1) ,
OUT ADDTS TIMESTAMP ,
OUT ADDUSER CHAR(8) ,
OUT ADDPROGRAM CHAR(8) ,
OUT UPDTS TIMESTAMP ,
OUT UPDUSER CHAR(8) ,
OUT UPDPROGRAM CHAR(8) ,
OUT OUTCODE INTEGER )
LANGUAGE COBOL
DETERMINISTIC
READS SQL DATA
EXTERNAL NAME 'SPROC02'
COLLID DPB_COLLID
ASUTIME NO LIMIT
PARAMETER STYLE GENERAL
STAY RESIDENT NO
RUN OPTIONS 'MSGFILE(OUTFILE),RPTSTG(ON),RPTOPTS(ON)'
WLM ENVIRONMENT ENV1DB2
PROGRAM TYPE MAIN
SECURITY DB2
RESULT SETS 2
COMMIT ON RETURN YES;
之后,这是我将调用存储过程的主程序代码
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. COBA12.
AUTHOR. AESANJA.
DATE-WRITTEN. 19 OKT 2017.
DATE-COMPILED.
DATA DIVISION.
WORKING-STORAGE SECTION.
*************************************************************
*INCLUDE SQLCA ITU SQL COMMUNICATION AREA *
*SETIAP SELESAI MENJALANKAN SQL STATEMENT DAN SELESAI *
*NILAI AKAN BERUBAH *
*************************************************************
EXEC SQL
INCLUDE SQLCA
END-EXEC.
*************************************************************
*INCLUDE DCLGEN NYA YANG DIGUNAKAN UNTUK AKSES DATABASE *
*MEMUNGKIKAN PROGRAM MELIHAT STRUKTUR TABLE DARI DATABASE *
*************************************************************
EXEC SQL
INCLUDE DAAVACDC
END-EXEC.
77 SQLRETCODE PIC 9(9).
01 WS-SQL-STORAGE.
05 AVAC-BRANCH-NO PIC X(7).
05 SQL-STATEMENT.
49 SQL-STATEMENT-LEN PIC S9(4) COMP VALUE +320.
49 SQL-STATEMENT-TEXT PIC X(320).
01 BRANCH PIC X(07).
01 ACCTNO PIC X(11).
01 AVAILABLE PIC X(01).
01 ADDTS PIC X(26).
01 ADDUSER PIC X(08).
01 ADDPROGRAM PIC X(08).
01 UPDTS PIC X(26).
01 UPDUSER PIC X(08).
01 UPDPROGRAM PIC X(08).
01 OUTCODE PIC S9(9) USAGE COMP.
PROCEDURE DIVISION.
MAIN-PROC.
MOVE 1 TO BRANCH.
MOVE 3913 TO ACCTNO.
EXEC SQL CALL CISUSER.SP02KE04(:BRANCH ,
:ACCTNO ,
:AVAILABLE ,
:ADDTS ,
:ADDUSER ,
:ADDPROGRAM,
:UPDTS ,
:UPDUSER ,
:UPDPROGRAM,
:OUTCODE )
END-EXEC.
DISPLAY "SP-DA-AVAC-BRANCH " BRANCH.
DISPLAY "SP-DA-AVAC-ACCT-NO " ACCTNO.
DISPLAY "SP-DA-AVAC-AVAILABLE " AVAILABLE.
DISPLAY "SP-DA-AVAC-ADD-TS " ADDTS.
DISPLAY "SP-DA-AVAC-ADD-USER " ADDUSER.
DISPLAY "SP-DA-AVAC-ADD-PROGRAM " ADDPROGRAM.
DISPLAY "SP-DA-AVAC-UPD-TS " UPDTS.
DISPLAY "SP-DA-AVAC-UPD-USER " UPDUSER.
DISPLAY "OUT-CODE " OUTCODE.
停止运行。
在我预编译、编译、链接我的程序后使用这个
//EXECUTE JOB (123),CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,MSGLEVEL=(1,1)
//*
//* -------------------------------------------------------------------
//* --- Cobol Compile - Batch or CICS ---
//* -------------------------------------------------------------------
//*
//* ---------------------------------------------------------- *//
//* SCAN CODE FOR CICS, DB2 OR DLI ..... *//
//* ---------------------------------------------------------- *//
//*
//DB2SCAN EXEC PGM=IRXJCL,COND=(4,LT),
// PARM='Ps-s-rCSCN COBA12'
//*
//SYSTSPRT DD SYSOUT=*
//SYSEXEC DD DISP=SHR,DSN=CCCLCM.V600.BCA.CLIST
//SYSTSIN DD SYSOUT=*
//CBLSRC DD DSN=AESANJA.LEARN.DB2(COBA12),DISP=SHR
//CBLSRCO DD DISP=(,PASS),DSN=&&SRCFULL,
// SPACE=(CYL,(10,10),RLSE),
// DCB=(DSORG=PS,RECFM=FB,LRECL=80,BLKSIZE=0)
//DB2OPTS DD *
CBL SQL("HOST(IBMCOB),APOST,APOSTSQL")
CBL SQL("DATE(ISO),TIME(ISO),LEVEL(DB2CIS)")
/*
//FILEOT DD DISP=(,PASS),DSN=&&TMPLNK,
// SPACE=(TRK,(15,15)),UNIT=SYSDA,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120)
//*
//* ---------------------------------------------------------- *//
//* COBOL COMPILE *//
//* *//
//* ---------------------------------------------------------- *//
//COMPILE EXEC PGM=IGYCRCTL,REGION=0M,
// PARM=('DATA(31)','FLAG(I,E)',APOST,MAP,LIST,
// 'SIZE(24000K)',NOADV)
//STEPLIB DD DSN=ECOB.V4R2M0.SIGYCOMP,DISP=SHR
// DD DSN=DB2DEV.DSNUAT2.SDSNEXIT,DISP=SHR
// DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
// DD DSN=CICSTS53.CICS.SDFHLOAD,DISP=SHR
// DD DSN=WMQ.V701.TLIB.SCSQLOAD,DISP=SHR
//SYSIN DD DATA
/*
// DD DSN=&&SRCFULL,DISP=(OLD,DELETE,DELETE)
//*
//SYSLIB DD DISP=SHR,DSN=LCM.DEFAULT.EMPTY.COPYLIB
// DD DISP=SHR,DSN=LCM.MNI.BCA.P.COPY
// DD DISP=SHR,DSN=LCM.DEFAULT.EMPTY.COPYLIB
// DD DISP=SHR,DSN=LCM.MNI.BCA.P.ONLCOPY
// DD DSN=WMQ.V701.TLIB.SCSQCOBC,DISP=SHR
// DD DISP=SHR,DSN=LCM.GGLM.GL312.P.COPY
// DD DISP=SHR,DSN=LCM.GGLM.P.COPY
// DD DISP=SHR,DSN=LCM.ATM.CMS.P.COPY
// DD DISP=SHR,DSN=LCM.ATM.L24.P.COPY
// DD DISP=SHR,DSN=ATMD.CARD.SOURCE
// DD DISP=SHR,DSN=ATMD.MNI.SOURCE
// DD DISP=SHR,DSN=EBSD.BCA.PROD.COPY
// DD DISP=SHR,DSN=EBSD.BCA.PROD.ONLCOPY
// DD DISP=SHR,DSN=IBS.UND.PROD.COPY
// DD DISP=SHR,DSN=LCM.KUX.P.COPY
// DD DISP=SHR,DSN=LCM.KUX.P.ONLCOPY
//* DD DISP=SHR,DSN=CARDD.LA10.COPYLIB.CX2091
//* REQUEST BY SGT 15 MAY 2015
// DD DISP=SHR,DSN=LCM.CARD.P.SCPYB
// DD DISP=SHR,DSN=LCM.CARD.P.SCPYC
//* STLH CUT OFF CRD 11 JUL '13
//* LHM MEN+KAN DD DISP=SHR,DSN=LCM.CARD.P.SCPYC 07 OCT 2013
//DBRMLIB DD DISP=SHR,DSN=IBS.BCA.DEV.DBRMLIB(COBA12)
//SYSLIN DD DISP=(,PASS),DSN=&&TMPOBJ,
// UNIT=3390,SPACE=(TRK,(25,25)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120)
//SYSPRINT DD SYSOUT=*
//*
//SYSUT1 DD UNIT=3390,SPACE=(CYL,(15,5))
//SYSUT2 DD UNIT=3390,SPACE=(CYL,(15,5))
//SYSUT3 DD UNIT=3390,SPACE=(CYL,(15,5))
//SYSUT4 DD UNIT=3390,SPACE=(CYL,(15,5))
//SYSUT5 DD UNIT=3390,SPACE=(CYL,(15,5))
//SYSUT6 DD UNIT=3390,SPACE=(CYL,(15,5))
//SYSUT7 DD UNIT=3390,SPACE=(CYL,(15,5))
//*
//*-------------------------------------------------------------------*
//* LINKEDIT *
//*-------------------------------------------------------------------*
//LINK IF COMPILE.RC LE 4 THEN
//LINKEDIT EXEC PGM=HEWL,
// PARM=(LIST,XREF,LET,'AC=0','SIZE=(512K,100K)',
// 'AMODE(31)','RMODE(ANY)',CALL)
//SYSUT1 DD UNIT=3390,SPACE=(TRK,(15,5))
//SYSLMOD DD DSN=AESANJA.LEARN.LOAD(COBA12),DISP=SHR
//* SYSLIB DD DISP=(SHR,PASS),DSN=&&TMPOBJ
//SYSLIB DD DISP=SHR,DSN=AESANJA.LEARN.LOAD
// DD DSN=LCM.MNI.BCA.P.LOAD,DISP=SHR
// DD DSN=FISD.MILL30.LOAD,DISP=SHR
// DD DSN=FISD.MILL30.GL312.LOAD,DISP=SHR
// DD DSN=ATMD.BASE24.L24R512.PROD.CICSLOAD,DISP=SHR
//* DD DSN=WMQ.V701.TLIB.SCSQLOAD,DISP=SHR
// DD DSN=IMS.OTX.SDFSRESL,DISP=SHR
// DD DISP=SHR,DSN=SYS1.CEE.SCEELKED
// DD DISP=SHR,DSN=DB2DEV.SDSNLOAD
// DD DISP=SHR,DSN=SYS1.LINKLIB
//CSQSTUB DD DSN=WMQ.V701.TLIB.SCSQLOAD,DISP=SHR
//CSQSTUB DD DSN=WMQ.V701.TLIB.SCSQLOAD,DISP=SHR
//TSTLIB DD DSN=AESANJA.LEARN.LOAD,DISP=SHR
//SYSPRINT DD SYSOUT=*
//OBJECT DD DISP=(SHR,PASS),DSN=&&TMPOBJ
//SYSLIN DD DISP=(SHR,PASS),DSN=&&TMPLNK
// DD *
/*
//LINK ENDIF
//*
//*
最后我绑定了我的程序
//BIND JOB REGION=4M,NOTIFY=&SYSUID,MSGLEVEL=(1,1) JOB15655
//SQLBIND PROC
//BIND EXEC PGM=IKJEFT01,DYNAMNBR=20
//DBRMLIB DD DSN=IBS.BCA.DEV.DBRMLIB,DISP=SHR
//STEPLIB DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSTSIN DD DDNAME=SYSTSIN
// PEND
//STEP2 EXEC SQLBIND
//****************************************************************
//* UBAH XXXXXXXX MENJADI NAMA PROGRAM
//****************************************************************
//BIND.SYSTSIN DD *
DSN SYSTEM(DSN1)
BIND PACKAGE(DPB_COLLID) -
OWNER(CISUSER) -
MEMBER(COBA12) -
DYNAMICRULES(BIND) -
VALIDATE(BIND) -
ISOLATION(CS) -
RELEASE(COMMIT) -
EXPLAIN(YES)
END
DSN SYSTEM(DSN1)
BIND PLAN(COBA13) -
OWNER(CISUSER) -
PKLIST(DPB_COLLID.COBA12) -
RETAIN -
DYNAMICRULES(BIND) -
VALIDATE(BIND) -
ISOLATION(CS) -
ACQUIRE(USE) -
RELEASE(COMMIT) -
EXPLAIN(YES)
END
/*
然后我运行我的程序 使用这个
//DB200001 JOB CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,MSGLEVEL=(1,1), JOB22858
// REGION=4M,TIME=1440
//*-----------------------------------------------------------
//CICCODE2 EXEC PGM=IKJEFT01
//STEPLIB DD DSN=AESANJA.LEARN.LOAD,DISP=SHR
// DD DSN=LCM.MNI.BCA.P.DB2LOAD,DISP=SHR
// DD DSN=LCM.MNI.BCA.P.LOAD,DISP=SHR
// DD DSN=DB2DEV.SDSNLOAD,DISP=SHR
//SYSTSPRT DD SYSOUT=A
//SYSUDUMP DD SYSOUT=A
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSERROR DD SYSOUT=*
//SYSOUT DD SYSOUT=A
//SYSOUD DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DSN1) RETRY(0) TEST(0)
RUN PROGRAM(COBA12) PLAN(COBA12) -
LIB('AESANJA.LEARN.LOAD')
一切正常,我得到了用于编译的返回码 4,而在另一份工作中得到了 0 的返回码 然后coba12程序的显示没有显示我想要获取的其他数据
********************************* TOP OF DATA *************************************************************************************
SP-DA-AVAC-BRANCH 1
SP-DA-AVAC-ACCT-NO 3913
SP-DA-AVAC-AVAILABLE
SP-DA-AVAC-ADD-TS
SP-DA-AVAC-ADD-USER
SP-DA-AVAC-ADD-PROGRAM
SP-DA-AVAC-UPD-TS
SP-DA-AVAC-UPD-USER
OUT-CODE 000000000
******************************** BOTTOM OF DATA ***********************************************************************************
在此之前,我尝试在存储过程代码“sproc02”上显示一些内容 但它没有出现在 spool sysout 上,是不是我的存储过程没有被调用 或者我做错了 jcl / flow 换句话说,它不返回任何结果 非常感谢您的回答,谢谢:)
【问题讨论】:
COBA12 的来源在哪里?我只在示例中看到 COBA10 糟糕,我会将其编辑为 coba12。我忘记在这篇文章中重新编辑。但是主框架的源代码是coba 12 【参考方案1】: *----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. MAIN.
AUTHOR. DUMMY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 BRANCH PIC X(07).
01 ACCTNO PIC X(11).
01 AVAILABLE PIC X(01).
01 ADDTS PIC X(26).
01 ADDUSER PIC X(08).
01 ADDPROGRAM PIC X(08).
01 UPDTS PIC X(26).
01 UPDUSER PIC X(08).
01 UPDPROGRAM PIC X(08).
01 OUTCODE PIC S9(09) USAGE BINARY.
PROCEDURE DIVISION.
MOVE 1 TO BRANCH.
MOVE 3913 TO ACCTNO.
CALL 'SPROC02' USING BRANCH ,
ACCTNO ,
AVAILABLE ,
ADDTS ,
ADDUSER ,
ADDPROGRAM,
UPDTS ,
UPDUSER ,
UPDPROGRAM,
OUTCODE.
EVALUATE OUTCODE
WHEN +0
CONTINUE
WHEN OTHER
DISPLAY 'ERROR CALL SPROC02 RC: ' OUTCODE
END-EVALUATE.
DISPLAY "SP-DA-AVAC-BRANCH " BRANCH.
DISPLAY "SP-DA-AVAC-ACCT-NO " ACCTNO.
DISPLAY "SP-DA-AVAC-AVAILABLE " AVAILABLE.
DISPLAY "SP-DA-AVAC-ADD-TS " ADDTS.
DISPLAY "SP-DA-AVAC-ADD-USER " ADDUSER.
DISPLAY "SP-DA-AVAC-ADD-PROGRAM " ADDPROGRAM.
DISPLAY "SP-DA-AVAC-UPD-TS " UPDTS.
DISPLAY "SP-DA-AVAC-UPD-USER " UPDUSER.
DISPLAY "OUT-CODE " OUTCODE.
STOP RUN.
【讨论】:
以上是关于cobol 上的外部存储过程 db2的主要内容,如果未能解决你的问题,请参考以下文章
从客户端调用 DB2 外部存储过程失败并显示 CPF9810