JCL を使用した外部 SQL プロシージャーの作成

JCL の使用は、外部 SQL プロシージャーを作成および準備するいくつかの方法のうちの 1 つです。

始める前に

非推奨の関数 :外部SQLプロシージャは非推奨であり、ネイティブSQLプロシージャほど完全にサポートされていません。 最良の結果を得るために、代わりにネイティブ SQL プロシージャーを作成します。 詳細は、「ネイティブSQLプロシージャの作成 」および 「外部SQLプロシージャのネイティブSQLプロシージャへの移行 」を参照してください。

このタスクについて

制限事項制限:JCL を使用して、 Db2 ストアド プロシージャ デバッガまたは統合デバッガでデバッグするための外部 SQL プロシージャを準備することはできません。 これらのデバッグツールのいずれかを使用する場合は、DSNTPSMPを使用して外部SQLプロシージャを作成します。

プロシージャー

JCL を使用して外部 SQL プロシージャーを作成するには、JCL ジョブに以下のジョブ・ステップを組み込みます。

  1. FENCED キーワードまたは EXTERNAL キーワードのいずれか、およびプロシージャー本体 (SQL で記述) を含む、CREATE PROCEDURE ステートメントを発行します。

    あるいは、SPUFI、 DSNTEP2、DSNTIAD、または Db2 command line processor などのアプリケーションを使用して、CREATE PROCEDURE文を動的に発行することもできます。

    ヒント: CREATE PROCEDURE文のルーチン本体にセミコロンが埋め込まれている場合は、デフォルトのSQLターミネータ文字をセミコロンからパーセント記号(%)などの他の特殊文字に変更します。

    この文は、 Db2 へのストアドプロシージャを定義します。 Db2 Db2 カタログに定義を保存します。

  2. HOST(SQL) オプションを指定してプログラム DSNHPC を実行します。

    このプログラムは、外部 SQL プロシージャーのソース・ステートメントを C 言語のプログラムに変換します。 DSNHPC はまた、SYSUT1 DD ステートメントに指定されたデータ・セットに新しい CREATE PROCEDURE ステートメントを書き込みます。

  3. 次のいずれかの手法を使用して、生成された C プログラムをプリコンパイル、コンパイル、およびリンク・エディットします。
    • プログラムをコンパイル、リンク・エディットするための Db2 プリコンパイラーおよび JCL 命令
    • SQL ステートメント・コプロセッサー
    このステップを実行するときに、以下の設定を指定してください。
    • 外部 SQL プロシージャーのロード・モジュールの名前と同じ名前を DBRM に付けてください。
    • MARGINS SQL 処理オプションに対して MARGINS(1,80) を指定してください。
    • NOSEQ コンパイラー・オプションを指定してください。

    この処理により、実行可能 C 言語プログラムが生成されます。

  4. 結果の DBRM をパッケージにバインドします。

次の CREATE PROCEDURE ステートメントを動的に発行して外部 SQL プロシージャーを定義するとします。
CREATE PROCEDURE DEVL7083.EMPDTLSS
(
 IN  PEMPNO        CHAR(6)
,OUT PFIRSTNME     VARCHAR(12)
,OUT PMIDINIT      CHAR(1)
,OUT PLASTNAME     VARCHAR(15)
,OUT PWORKDEPT     CHAR(3)
,OUT PHIREDATE     DATE
,OUT PSALARY       DEC(9,2)
,OUT PSQLCODE      INTEGER
)
RESULT SETS 0
MODIFIES SQL DATA
FENCED
NO DBINFO
WLM ENVIRONMENT DB2AWLMR
STAY RESIDENT NO
COLLID DEVL7083
PROGRAM TYPE MAIN
RUN OPTIONS 'TRAP(OFF),RPTOPTS(OFF)'
COMMIT ON RETURN NO
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER;
DECLARE SQLSTATE CHAR(5);
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET PSQLCODE = SQLCODE;
SELECT
       FIRSTNME
     , MIDINIT
     , LASTNAME
     , WORKDEPT
     , HIREDATE
     , SALARY
INTO   PFIRSTNME
     , PMIDINIT
     , PLASTNAME
     , PWORKDEPT
     , PHIREDATE
     , PSALARY
FROM   EMP
WHERE  EMPNO = PEMPNO
;
END
次の JCL のような JCL を使用して、プロシージャーを準備できます。
//ADMF001S JOB (999,POK),'SQL C/L/B/E',CLASS=A,MSGCLASS=T,
// NOTIFY=ADMF001,TIME=1440,REGION=0M
/*JOBPARM SYSAFF=SC63,L=9999
// JCLLIB ORDER=(DB2AU.PROCLIB)
//*
//JOBLIB  DD  DSN=DB2A.SDSNEXIT,DISP=SHR
//        DD  DSN=DB2A.SDSNLOAD,DISP=SHR
//        DD  DSN=CEE.SCEERUN,DISP=SHR
//*----------------------------------------------------------
//*        STEP 01: PRECOMP, COMP, LKED AN SQL PROCEDURE
//*----------------------------------------------------------
//SQL01 EXEC DSNHSQL,MEM=EMPDTLSS,
//  PARM.PC='HOST(SQL),SOURCE,XREF,MAR(1,80),STDSQL(NO)',
//  PARM.PCC='HOST(C),SOURCE,XREF,MAR(1,80),STDSQL(NO),TWOPASS',
//  PARM.C='SOURCE LIST MAR(1,80) NOSEQ LO RENT',
//             PARM.LKED='AMODE=31,RMODE=ANY,MAP,RENT'
//PC.SYSLIB DD DUMMY
//PC.SYSUT2 DD DSN=&&SPDML,DISP=(,PASS), <=MAKE IT PERMANENT, IF YOU 
//           UNIT=SYSDA,SPACE=(TRK,1),      WANT TO USE IT LATER 
//           DCB=(RECFM=FB,LRECL=80) 
//PC.SYSIN     DD DISP=SHR,DSN=SG247083.PROD.DDL(&MEM.) 
//PC.SYSCIN    DD DISP=SHR,DSN=SG247083.TEST.C.SOURCE(&MEM.) 
//PCC.SYSIN    DD DISP=SHR,DSN=SG247083.TEST.C.SOURCE(&MEM.) 
//PCC.SYSLIB   DD DUMMY 
//PCC.DBRMLIB  DD DISP=SHR,DSN=SG247083.DEVL.DBRM(&MEM.) 
//LKED.SYSLMOD DD DISP=SHR,DSN=SG247083.DEVL.LOAD(&MEM.) 
//LKED.SYSIN DD *     INCLUDE SYSLIB(DSNRLI)     NAME EMPDTLSS(R) 
/* 
//*----------------------------------------------------------
//*        STEP 02: BIND THE PROGRAM
//*----------------------------------------------------------
//SQL02 EXEC PGM=IKJEFT01,DYNAMNBR=20,COND=(4,LT)
//DBRMLIB  DD DSN=SG247083.DEVL.DBRM,DISP=SHR 
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//REPORT   DD SYSOUT=*
//SYSIN    DD *
//SYSTSIN DD *
 DSN SYSTEM(DB2A)
 BIND PACKAGE(DEVL7083) MEMBER(EMPDTLSS) VALIDATE(BIND) -
 OWNER(DEVL7083)
 END
//*