ストアド プロシージャ定義 (SPD) ファイルは、ストアド プロシージャを定義するファイルであり、ストアド プロシージャで COBOL データ型パラメーターを使用する場合に SQL CLR 統合のために必要となります。Visual COBOL では、SPD ファイルを使用して、SQL CLR 環境で必要とされる .NET データ型パラメーターに COBOL データ型パラメーターを変換する COBOL ラッパー プログラムを生成します。
Visual Studio でソリューション エクスプローラーから SQL Server データベース プロジェクト用の SPD ファイルを作成および手動でコーディングすることができます。、任意のファイル エディターを使用して、SPD ファイルを手動でコーディングすることができます。.spd ファイル拡張子を付けてファイルを保存します。 Visual Studio の外部で SPD ファイルを作成する場合は、Visual COBOL SQL Server データベース プロジェクトに追加します。詳細については、「ストアド プロシージャ定義 (SPD) ファイルの作成」および「COBOL ラッパー プログラム」を参照してください。
SPD ファイルには、CREATE PROCEDURE 文、および必要に応じて COBOL ラッパーの生成オプションが含まれている必要があります (詳細は、下記の「SPD 生成オプション」を参照してください)。
CREATE PROCEDURE 文は、ストアド プロシージャ内のパラメーターのデータ型を宣言し、ストアド プロシージャの期待される動作に関するその他の情報も提供します。SPD ファイルには、CREATE PROCEDURE 文が含まれている必要があります。この文はファイル内の SPD 生成オプションに従います (詳細については、下記の「SPD 生成オプション」セクションを参照してください)。
>>--CREATE PROCEDURE procedure_name (parameter_desc)--.-----------.-->< V | +option_desc+ +---,--------+ V : +---,------+ parameter_desc ::= .-IN-----. >>-+--------+--parameter_name--data_type-->< +--OUT---+ +--INOUT-+ option_desc ::= .-DYNAMIC RESULT SETS 0--------. >--+------------------------------+-------------------------------> '-DYNAMIC RESULT SETS--integer-' >--+-----------------------------------+---+------------------+---> | | |--LANGUAGE COBOL--| '-EXTERNAL NAME--+-'string'---+-----' '-identifier-' >--+--------------------------------------------------------------< |--PARAMETER STYLE---+-GENERAL------------+ |-GENERAL WITH NULLS-|
CREATE PROCEDURE 文に加えて、SPD ファイルには、COBOL ラッパー プログラムの生成方法を指定する生成オプションを含めることができます。
例えば、ストアド プロシージャを呼び出すプログラムの種類に応じて特定のパラメーター名または型を使用して、ラッパー プログラムを生成する必要があることがあります。VB.NET または Java プログラムからストアド プロシージャを呼び出す必要がある場合、各パラメーターに対するデフォルトの "lk" プレフィックスは不要であることがあります。また、SQLCA で使用可能なものよりも長いエラー メッセージを返す必要があることもあります。
SPD ファイルでは、CREATE PROCEDURE 文の前に生成オプションを指定します。セミコロン (;) を使用して各オプションを区切ることで、複数のオプションを指定できます。
以下に、各 SPD 生成オプションを示します。
以下の各例は、SPD ファイルとその結果として生成される COBOL ラッパー プログラムを示しています。
CREATE PROCEDURE X1103670 (OUT SRMODRET VARCHAR(650) , IN SKPRMF1AE CHAR(250) , OUT SKPRMF1AS TIMESTAMP ) DYNAMIC RESULT SETS 1 EXTERNAL NAME SKPRMF1A LANGUAGE COBOL PARAMETER STYLE GENERAL;
生成される COBOL ラッパー プログラム:
* $set dialect(mf) charset(ascii) $set sql(dbman=ado behavior=optimized dialect=mainframe nocheck) $set sourceformat(variable) $set ilusing(Microsoft.SqlServer.Server) $set notrunc class-id X1103670_CLASS is partial. method-id X1103670 static attribute SqlProcedureAttribute. local-storage section. 01 lsSRMODRET. 49 lsSRMODRET-LEN PIC S9(4) BINARY. 49 lsSRMODRET-TXT PIC X(650). 01 lsSKPRMF1AE PIC X(250). 01 lsSKPRMF1AS PIC X(26). 01 ts_format string. 01 time_hh binary-long. 01 time_mm binary-long. 01 ls_dt type DateTime. 01 ls_SqlRts type MFClrRts.MFClrRts. procedure division using by output lkSRMODRET as STRING attribute SqlFacet(name MaxSize = 650), by value lkSKPRMF1AE as STRING attribute SqlFacet(name MaxSize = 250), by value lkSKPRMF1AS as STRING attribute SqlFacet(name MaxSize = 26). *> MOVE INPUT data to COBOL parameters MOVE lkSKPRMF1AE TO lsSKPRMF1AE CALL "SKPRMF1A" USING lsSRMODRET, lsSKPRMF1AE, lsSKPRMF1AS. *> MOVE OUTPUT data from COBOL parameters MOVE lsSRMODRET-TXT(1:lsSRMODRET-LEN) TO lkSRMODRET MOVE lsSKPRMF1AS TO lkSKPRMF1AS *> GET SQL Runtime for deadlock detection exec ado get runtime into :ls_SqlRts end-exec if ls_SqlRts::ClrCallAborted display "#@$%:1:" lsSRMODRET end-if goback. end method. end class.
PARMPREFIX=;DATE_FORMAT=USA;SPDMSG=400; POSTDEPLOY=C:\X1103670\X1103670\X1103670.Publish\Script.PD1.sql;NAMESPACE=X1103670; CREATE PROCEDURE X1103670 (OUT SRMODRET VARCHAR(650) , IN SKPRMF1AE CHAR(250) , OUT SKPRMF1AS DATETIME2 ) DYNAMIC RESULT SETS 0 EXTERNAL NAME SKPRMF1A LANGUAGE COBOL PARAMETER STYLE GENERAL;
生成される COBOL ラッパー プログラム:
* $set dialect(mf) charset(ascii) $set sql(dbman=ado behavior=optimized dialect=mainframe nocheck) $set sourceformat(variable) $set ilusing(Microsoft.SqlServer.Server) $set notrunc * $set sql(date=USA TIME=ISO detectdate ) class-id X1103670_CLASS is partial. method-id X1103670 static attribute SqlProcedureAttribute. local-storage section. 01 lsSRMODRET. 49 lsSRMODRET-LEN PIC S9(4) BINARY. 49 lsSRMODRET-TXT PIC X(650). 01 lsSKPRMF1AE PIC X(250). 01 lsSKPRMF1AS PIC X(26). 01 ts_format string. 01 time_hh binary-long. 01 time_mm binary-long. 01 ls_dt type DateTime. 01 ls_SqlRts type MFClrRts.MFClrRts. 01 MFSQLMESSAGETEXT PIC X(400). procedure division using by output SRMODRET as STRING attribute SqlFacet(name MaxSize = 650), by value SKPRMF1AE as STRING attribute SqlFacet(name MaxSize = 250), by output SKPRMF1AS as type System.DateTime attribute SqlFacet(name Scale= 6). *> MOVE INPUT data to COBOL parameters MOVE SKPRMF1AE TO lsSKPRMF1AE CALL "SKPRMF1A" USING lsSRMODRET, lsSKPRMF1AE, lsSKPRMF1AS. *> MOVE OUTPUT data from COBOL parameters MOVE lsSRMODRET-TXT(1:lsSRMODRET-LEN) TO SRMODRET set ts_format to "yyyy-MM-dd-HH.mm.ss.ffffff" set SKPRMF1AS TO type DateTime::ParseExact(lsSKPRMF1AS, ts_format, type System.Globalization.CultureInfo::CurrentCulture) *> GET SQL Runtime for deadlock detection exec ado get runtime into :ls_SqlRts end-exec if ls_SqlRts::ClrCallAborted display "#@$%:1:" lsSRMODRET display "#@$%:3:" lsSKPRMF1AS end-if goback. end method. end class.