ストアド プロシージャ定義 (SPD) ファイルはストアド プロシージャを定義し、ストアド プロシージャが COBOL データ型パラメーターを使用する場合に SQL CLR の統合に必要となります。Enterprise Developer は SPD ファイルを使用して、COBOL データ型パラメーターを SQL CLR 環境で必要な .NET データ型パラメーターに変換する COBOL ラッパー プログラムを生成します。
Visual Studio でソリューション エクスプローラーから SQL Server データベース プロジェクト用の SPD ファイルを作成および手動でコーディングすることができます。また、必要に応じて、HCOSS を使用して SPD ファイルを生成することもできます。また、任意のファイル エディターを使用して、SPD ファイルを手動でコーディングすることができます。.spd ファイル拡張子を付けてファイルを保存します。 Visual Studio の外部で SPD ファイルを作成する場合は、Enterprise Developer SQL Server データベース プロジェクトに追加します。詳細については、「ストアド プロシージャ定義 (SPD) ファイルの作成」および「COBOL ラッパー プログラム」を参照してください。HCOSS を使用して SPD ファイルを生成する場合は、下記の「SPD ファイルの生成」のセクションも参照してください。
SPD ファイルには、CREATE PROCEDURE 文、および必要に応じて COBOL ラッパーの生成オプションが含まれている必要があります (詳細は、下記の「SPD 生成オプション」を参照してください)。
SPD ファイルは、Generate SPD File ツールおよび Extract Schema HCO for SQL Server (HCOSS) ツールを使用して生成できます。Generate SPD File ツールでは、HCOSS Extract Schema ツールを使用して抽出したスキーマに基づく CREATE PROCEDURE 文を含むファイルを生成できます。詳細については、「Extract Schema ツール」および「Generate SPD File ツール」を参照してください。
また、このツールでは、HCOSS 構成オプションの [SPD Generator Options] セクションで指定したデフォルト以外の値に対応する SPD 生成オプションも生成できます。詳細については、「HCOSS オプションを設定するには」を参照してください。
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 ファイルとその結果として生成される 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;
* $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;
* $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.