玩了一天,晚上静下心来写点博客,关于使用coboL 编写external procedure
具体的步骤如下:
1WLM environment must be set up. OS协助
2. LE environment must be set up.
OS协助(系统安装完成后都应该有)
3. The stored procedure must be defined to DB2. Note in particular that if the stored
procedure is designed to return result sets, the maximum number of result sets that can
be returned is specified in the definition.
4. Develop the stored procedure. This includes the preparation of the stored procedure for
execution, including binding a package if it contains SQL.
5. Grant the necessary privileges to the authorization ID of the user that executes the stored
procedure.
6. Develop the calling application, if needed.
通过上面的步骤我们看出主要的开发步骤主要包括:
3,4,6 其它的都很简单的,下面举例说明
STEP1 :
比如我们想创建一个empAUDTS的procedure,首先在DB2中定义该procedure如下:
-
DROP PROCEDURE DEVL7083.EMPAUDTS #
-
COMMIT#
-
CREATE PROCEDURE DEVL7083.EMPAUDTS
-
(
-
IN PEMPNO CHAR(6)
-
,IN POLDSALARY DEC(9,2)
-
,IN PNEWSALARY DEC(9,2)
-
)
-
RESULT SETS 0
-
EXTERNAL NAME EMPAUDTS 需要特别注意的是这里,这里定义loadmodule的名字,即我们编写的程序的名字
-
LANGUAGE COBOL
-
PARAMETER STYLE GENERAL
-
MODIFIES SQL DATA
-
NO DBINFO
-
WLM ENVIRONMENT DB2GDEC1 /wlm envionment
-
STAY RESIDENT NO
-
COLLID DEVL7083
-
PROGRAM TYPE SUB
-
COMMIT ON RETURN NO #
-
GRANT EXECUTE ON PROCEDURE DEVL7083.EMPAUDTS TO PUBLIC #
其实上面的这一步与其说是定义了一个procedure,不过说是关联了一个cobol程序,该程序执行的时候,会直接调用我们的load module
而load module 则是cobol的结果
STEP2:
我们的cobol程序如下:
在上面需要注意的地方有:
该section类似C语言中的变量声明
-
005100 01 PEMPNO PIC X(6). 00510012
-
005200 01 POLDSALARY PIC S9(7)V9(2) COMP-3. 00520012
-
005300 01 PNEWSALARY PIC S9(7)V9(2) COMP-3. 00530016
PROCEDURE DIVISION USING PEMPNO, POLDSALARY, PNEWSALARY.
类似C语言中的函数定义,需要注意的这里的声明,定义必须同上面
procedure的定义一致,你懂得
STEP3:
写完cobol之后,你需要做的就是编译程序,bind package
cobol程序编译完成后,不需要bind到plan,直接到package即可,原因不详(偶不是太懂哈)
编译的作业模板如下:
-
//PAOLOR6S JOB (999,POK),'COBOL C/L/B/E',CLASS=A,MSGCLASS=T, 00000001
-
// NOTIFY=PAOLOR6,TIME=1440,REGION=0M 00000002
-
/*JOBPARM SYSAFF=SC63,L=9999 00000003
-
// JCLLIB ORDER=(DB2V710G.PROCLIB) 00000004
-
//* 00250000
-
//JOBLIB DD DSN=DB2V710G.SDSNEXIT,DISP=SHR 00260000
-
// DD DSN=DB2G7.SDSNLOAD,DISP=SHR 00270000
-
// DD DSN=CEE.SCEERUN,DISP=SHR 00270001
-
//*---------------------------------------------------------- 00900000
-
//* STEP 01: PRECOMP, COMP, LKED A COBOL PROGRAM 01080000
-
//*---------------------------------------------------------- 00900000
-
//COBOL01 EXEC DSNHICOB,MEM=EMPAUDTS, 01090000
-
// COND=(4,LT), 01100000
-
// PARM.PC=('HOST(IBMCOB)',APOST,APOSTSQL,SOURCE, 01110000
-
// NOXREF,'SQL(DB2)','DEC(31)'), 01120000
-
// PARM.COB=(NOSEQUENCE,QUOTE,RENT,'PGMNAME(LONGUPPER)') 01130000
-
//PC.DBRMLIB DD DSN=SG247083.DEVL.DBRM(EMPAUDTS), 01150000
-
// DISP=SHR 01160000
-
//PC.SYSLIB DD DSN=SG247083.PROD.SOURCE, 01170000
-
// DISP=SHR 01180000
-
//PC.SYSIN DD DSN=SG247083.PROD.SOURCE(EMPAUDTS), 01190000
-
// DISP=SHR 01200000
-
//LKED.SYSLMOD DD DSN=SG247083.DEVL.LOAD(EMPAUDTS), 01210000
-
// DISP=SHR 01220000
-
//LKED.RUNLIB DD DSN=DB2V710G.RUNLIB.LOAD, 01230000
-
// DISP=SHR 01240000
-
//LKED.SYSIN DD * 01250000
-
INCLUDE SYSLIB(DSNRLI) 01260000
-
//*---------------------------------------------------------- 00900000
-
//* STEP 02: BIND THE PROGRAM 01290000
-
//*---------------------------------------------------------- 01280000
-
//COBOL02 EXEC PGM=IKJEFT01,DYNAMNBR=20,COND=(4,LT) 01300000
-
//DBRMLIB DD DSN=SG247083.DEVL.DBRM,DISP=SHR 01310000
-
//SYSTSPRT DD SYSOUT=* 01320000
-
//SYSPRINT DD SYSOUT=* 01330000
-
//SYSUDUMP DD SYSOUT=* 01340000
-
//SYSOUT DD SYSOUT=* 01350000
-
//REPORT DD SYSOUT=* 01360000
-
//SYSIN DD * 01370000
-
//SYSTSIN DD * 01390000
-
DSN SYSTEM(DB2G) 01400000
-
BIND PACKAGE(DEVL7083) MEMBER(EMPAUDTS) VALIDATE(BIND) - 01410000
-
OWNER(DEVL7083)
-
END 01460000
-
//* 01550000
LAST:
最后你需要做的就是调用的你的procedure程序了,不在赘述。
ref:
ibm red books
阅读(2733) | 评论(0) | 转发(0) |