ストアド プロシージャ定義 (SPD) ファイル

ストアド プロシージャ定義 (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 ファイルの生成

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 オプションを設定するには」を参照してください。

重要: Generate SPD File ツールでは、SPDMSG オプションは生成されません。SPDMSG を指定するには、生成された SPD ファイルを編集し、SPDMSG を生成オプションに追加します。詳細については、下記の「SPD 生成オプション」セクションを参照してください。

HCOSS を使用しない場合は、SPD ファイルを手動で作成する必要があります。

CREATE PROCEDURE 文

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-|
パラメーター
procedure_name
ストアド プロシージャの名前。
parameter_desc
parameter_name
パラメーターの名前。
data_type
対応するパラメーターのデータ型。サポートされるデータ型は次のとおりです。
  • SMALLINT、INTEGER、INT、BIGINT
  • DECIMAL(x,y)、DEC(x,y)、NUMERIC(x,y)
  • FLOAT、REAL
  • CHARACTER(x)、CHAR(x)、CHARACTER VARYING (x)、CHAR VARYING (x)、VARCHAR (x)、CLOB (x)
  • GRAPHIC (x)、VARGRAPHIC (x)、DBCLOB (x)
  • BINARY(x)、BINARY VARYING (x)、VARBINARY(x)、BLOB (x)
  • DATE、TIME、TIMESTAMP
  • TINYINT
  • NCHAR
  • MONEY
  • VARCHAR(MAX)
  • VARBINARY(MAX)
  • TIMESPAN
  • DATETIME、SMALLDATETIME、DATETIME2
ヒント: PIC X COBOL 変数の代わりに COBOL グループ変数を渡すには、SPD ファイルで BINARY または VARBINARY データ型を指定し、クライアントのストアド プロシージャ コードで BINARY または VARBINARY SQL 型を指定します。
option_desc
integer
返される結果セットの数。
string、identifier
ストアド プロシージャの外部名 (オプション)。

SPD 生成オプション

CREATE PROCEDURE 文に加えて、SPD ファイルには、COBOL ラッパー プログラムの生成方法を指定する生成オプションを含めることができます。

たとえば、ストアド プロシージャを呼び出すプログラムの種類に応じて特定のパラメーター名または型を使用して、ラッパー プログラムを生成する必要があることがあります。VB.NET または Java プログラムからストアド プロシージャを呼び出す必要がある場合、各パラメーターに対するデフォルトの "lk" プレフィックスは不要であることがあります。また、SQLCA で使用可能なものよりも長いエラー メッセージを返す必要があることもあります。

SPD ファイルでは、CREATE PROCEDURE 文の前に生成オプションを指定します。セミコロン (;) を使用して各オプションを区切ることで、複数のオプションを指定できます。

以下に、各 SPD 生成オプションを示します。

PARMPREFIX=value
生成されるラッパー パラメーター名のプレフィックスを設定します。
value
任意の文字または数字文字列。また、プレフィックスを付けないようにするには、値を省略します。
デフォルト
lk
PARMPREFIX=;
GENFIXEDLENGTH
INPUT VARCHAR パラメーターの長さ全体を移動します。
デフォルト
使用文字列の長さ。
GENFIXEDLENGTH;
SPDMSG=value
MFSQLMESSAGETEXT 変数を生成し、SQL エラー メッセージの最大文字列長を設定します。
value
72 よりも大きい任意の数。
デフォルト
72
SPDMSG=400;
DATE_FORMAT=value
生成される DATE SQL CLR ストアド プロシージャのパラメーターの日付形式。
value
次のいずれかの日付形式の指定:
  • ODBC
  • ISO
  • USA
  • EUR
  • JIS
注: 対応する生成形式のリストについては、「DATE」を参照してください。
デフォルト
ISO - yyyy-mm-dd (メインフレームのデフォルトの形式) を生成します。
DATE_FORMAT=USA;
TIME_FORMAT=value
生成される TIME SQL CLR ストアド プロシージャのパラメーターの日付形式。
value
次のいずれかの時間形式の指定:
  • ODBC
  • ISO
  • USA
  • EUR
  • JIS
注: 対応する生成形式のリストについては、「TIME」を参照してください。
デフォルト
ISO - hh:mm:ss (メインフレームのデフォルトの形式) を生成します。
TIME_FORMAT=USA;
POSTDEPLOY=value
ディプロイ後のスクリプト ファイルの名前および場所。Java ルーチンで TIMESTAMP パラメーターを使用してストアド プロシージャを呼び出す場合に必要です。詳細については、「ディプロイ後のスクリプト要件」を参照してください。
value
ディプロイ後のスクリプト ファイルのフル パスおよびファイル名を表す ScriptPath\Name
デフォルト
none
POSTDEPLOY=C:\MYPROJ\SQLD1.SQL;
NAMESPACE=value
SPD ファイルを含む COBOL マネージ プロジェクトのデフォルトのネームスペース。POSTDEPLOY も指定する場合に必要となります。Enterprise Developer におけるデフォルトのネームスペースはプロジェクト プロパティの [Application] タブで確認できます。詳細については、「ディプロイ後のスクリプト要件」を参照してください。
value
プロジェクト プロパティの [Application] タブで指定されているネームスペース。
デフォルト
none
NAMESPACE=X1103670;

SPD ファイルおよび生成される COBOL ラッパー プログラムの例

以下の各例は、SPD ファイルとその結果として生成される COBOL ラッパー プログラムを示しています。

例 1 - 生成オプションなし
使用する SPD ファイル:
   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.
例 2 - PARMPREFIX、DATE_FORMAT、SPDMSG、および POSTDEPLOY 生成オプション
使用する SPD ファイル:
   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.