ストアド プロセスは、実行可能オブジェクトとしてデータベースに保存された 1 つ以上の SQL コマンドです。
定義は常に抽象的です。ストアド プロセスは、実際には特定の操作を完了できる SQL ステートメントのセットですが、このステートメントのセットはデータベースに配置されます (ここでは SQL SERVER についてのみ説明します)。ストアド プロセスを作成し、そのストアド プロセスを ASP で呼び出すと、SQL ステートメントと ASP コードの混在を避けることができます。これを行うことには少なくとも 3 つの利点があります。
まず、効率が大幅に向上します。ストアド プロセス自体の実行速度は非常に高速であり、ストアド プロセスを呼び出すことでデータベースとのやり取りの数を大幅に減らすことができます。
第二に、安全性の向上です。 ASP コードに SQL ステートメントを混在させると、コードが侵害されると、ライブラリ構造も侵害されることになります。
第三に、SQL ステートメントの再利用に役立ちます。
ASP では、ストアド プロセスは通常、COMMAND オブジェクトを通じて呼び出されます。状況に応じて、この記事では他の呼び出し方法も紹介します。説明の便宜上、保存されたプロセスの入力と出力に基づいて次の簡単な分類が行われます。
1. 単一のレコードセットのみを返すストアドプロセス
次のストアド プロセスがあるとします (この記事の目的は T-SQL 構文を説明することではないため、ストアド プロセスはコードのみを説明せずに示します)。
/*SP1*/
プロシージャ DBO.GETUSERLIST の作成
として
ノーカウントをオンに設定
始める
SELECT * FROM DBO.[ユーザー情報]
終わり
行く
上記のストアド プロセスは、USERINFO テーブル内のすべてのレコードを取得し、レコード セットを返します。 COMMAND オブジェクトを通じてストアド プロセスを呼び出すための ASP コードは次のとおりです。
'**COMMAND オブジェクトを介してストアド プロセスを呼び出す**
ディム・マイコム、MYRST
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
MYCOMM.COMMANDTEXT = GETUSERLIST 'ストアドプロセス名を指定します
MYCOMM.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
MYCOMM.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
MYRST = MYCOMM.EXECUTE を設定します
MYCOMM = 何も設定しない
保存処理で取得したレコードセットを MYRST に割り当てます。次に、MYRST を操作できます。
上記のコードでは、COMMANDTYPE 属性はリクエストのタイプを示します。値と説明は次のとおりです。
-1 は、COMMANDTEXT パラメータのタイプを決定できないことを示します
1 は、COMMANDTEXT が一般的なコマンド タイプであることを示します
2 は、COMMANDTEXT パラメータが次のテーブル名であることを示します。
4 は、COMMANDTEXT パラメータがストアド プロセスの名前であることを示します
CONNECTION オブジェクトまたは RECORDSET オブジェクトを通じてストアド プロセスを呼び出すこともできます。メソッドは次のとおりです。
'**CONNECTION オブジェクトを介したストアド プロセスの呼び出し**
マースト州ディミーコン
SET MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR はデータベース接続文字列です
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) '最後のパラメータはCOMMANDTYPEと同じ意味です
MYCONN = 何も設定しない
'**RECORDSET オブジェクトを介したストアド プロセスの呼び出し**
ディマースト
SET MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST、MYCONSTR、0、1、4
'MYCONSTR はデータベース接続文字列で、最後のパラメータは COMMANDTYPE と同じ意味です
2. 入出力のないストアドプロセス
次のストアド プロシージャを見てください。
/*SP2*/
プロシージャ DBO.DELUSERALL の作成
として
ノーカウントをオンに設定
始める
DBO.[ユーザー情報]から削除
終わり
行く
このストアド プロセスは、入力も出力も行わずに USERINFO テーブル内のすべてのレコードを削除します。呼び出し方法は、レコード セットを取得する必要がないことを除いて、基本的に上記と同じです。
'**COMMAND オブジェクトを介してストアド プロセスを呼び出す**
ディミーコム
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
MYCOMM.COMMANDTEXT = DELUSERALL 'ストアドプロセス名を指定します
MYCOMM.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
MYCOMM.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
MYCOMM.EXECUTE 'ここで設定されたレコードを取得する必要はありません
MYCOMM = 何も設定しない
もちろん、このタイプのストアド プロセスは、CONNECTION オブジェクトまたは RECORDSET オブジェクトを通じて呼び出すこともできます。ただし、レコード セットを取得するために RECORDSET オブジェクトが作成されます。場合は、COMMAND オブジェクトを使用します。
3. 戻り値のあるストアド プロシージャ
SP2 のような操作を実行する場合は、SQL SERVER の強力なトランザクション処理機能を最大限に活用して、データの一貫性を維持する必要があります。さらに、プロセスによって返された実行ステータスを保存する必要がある場合があります。そのためには、SP2 を次のように変更します。
/*SP3*/
プロシージャ DBO.DELUSERALL の作成
として
ノーカウントをオンに設定
始める
取引を開始する
DBO.[ユーザー情報]から削除
IF @@エラー=0
始める
トランザクションのコミット
リターン1
終わり
それ以外
始める
ロールバックトランザクション
リターン0
終わり
戻る
終わり
行く
上記のストアドプロセスは、DELETE が正常に実行された場合は 1 を返し、それ以外の場合は 0 を返し、ロールバック操作を実行します。 ASP で戻り値を取得するには、PARAMETERS コレクションを使用してパラメーターを宣言する必要があります。
'**戻り値を指定してストアドプロセスを呼び出し、戻り値を取得します**
マイパラのディムマイコム
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
MYCOMM.COMMANDTEXT = DELUSERALL 'ストアドプロセス名を指定します
MYCOMM.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
MYCOMM.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
'戻り値を宣言する
SET MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
MYCOMM.EXECUTE
'戻り値を取得する
ディム戻り値
RETVALUE = MYCOMM(0) 'または RETVALUE = MYCOMM.PARAMETERS(0)
MYCOMM = 何も設定しない
MYCOMM.CREATEPARAMETER(RETURN,2,4) における各パラメータの意味は次のとおりです。
最初のパラメータ (RETURE) はパラメータ名です。パラメータ名は任意に設定できますが、通常はストアドプロセスで宣言したパラメータ名と同じにする必要があります。これが戻り値です。通常は RETURE に設定します。
2 番目のパラメータ (2) はパラメータのデータ型を示します。具体的な型コードについては、ADO リファレンスを参照してください。
アドビギント: 20;
追加: 128;
アドブール: 11;
アドチャー: 129;
追加タイムスタンプ: 135;
アデプティ: 0;
正整数: 3;
ADSMALLINT: 2;
ADTINYINT: 16;
ADVARCHAR: 200;
戻り値は整数値のみを取ることができ、-1~-99は予約値です。
3 番目のパラメーター (4) はパラメーターの性質を示し、4 はこれが戻り値であることを示します。このパラメータの値の説明は次のとおりです。
0: タイプを決定できません。1: 入力パラメータ。3: 入力パラメータまたは出力パラメータ。
上記の ASP コードは完全なコード、つまり最も複雑なコードであると言えます。
SET MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
に簡略化できます
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
後で説明するように、さらに単純化することもできます。
パラメータ付きのストアド プロシージャの場合、COMMAND オブジェクトを使用してのみ呼び出すことができます (CONNECTION オブジェクトまたは RECORDSET オブジェクトを通じて呼び出せるという情報もありますが、試していません)。
4. 入力パラメータと出力パラメータを使用したストアドプロセス
戻り値は実際には特別な出力パラメータです。多くの場合、入力パラメータと出力パラメータの両方を持つストアドプロセスを使用します。たとえば、ユーザー情報テーブル内の特定のIDを持つユーザーのユーザー名を取得したいとします。 ---ユーザー ID、および出力パラメーター---ユーザー名。この機能を実装するストアドプロセスは次のとおりです。
/*SP4*/
プロシージャ DBO.GETUSERNAME の作成
@USERIDINT、
@USERNAME VARCHAR(40) 出力
として
ノーカウントをオンに設定
始める
@USERID が NULL の場合は戻ります
SELECT @ユーザー名=ユーザー名
DBO より。[ユーザー情報]
WHERE ユーザー ID=@ユーザー ID
戻る
終わり
行く
ストアド プロセスを呼び出す ASP コードは次のとおりです。
'**入力パラメータと出力パラメータを使用してストアドプロセスを呼び出す**
DIM MYCOMM、ユーザーID、ユーザー名
ユーザーID=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
MYCOMM.COMMANDTEXT = GETUSERNAME 'ストアドプロセス名を指定します
MYCOMM.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
MYCOMM.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
'パラメータを宣言する
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
MYCOMM.EXECUTE
'パラメータを取得します
ユーザー名 = MYCOMM(1)
MYCOMM = 何も設定しない
上記のコードでは、戻り値の宣言とは異なり、入力パラメーターを宣言する場合は 5 つのパラメーターが必要であり、出力パラメーターを宣言する場合は 4 つのパラメーターが必要であることがわかります。入力パラメータを宣言する場合、パラメータ名、パラメータのデータ型、パラメータの型、データ長、パラメータ値の 5 つのパラメータが使用されます。出力パラメータを宣言する場合、最後のパラメータ、つまりパラメータ値はありません。
パラメータを宣言するときは、順序がストレージ プロセスで定義されたものと同じである必要があり、各パラメータのデータ型と長さもストレージ プロセスで定義されたものと同じである必要があることに特別な注意を払う必要があります。
ストアドプロセスに複数のパラメータがある場合、ASP コードは複雑に見えますが、WITH コマンドを使用してコードを簡素化できます。
'**入力パラメータと出力パラメータを使用してストアド プロセスを呼び出す (簡略化されたコード)**
DIM MYCOMM、ユーザーID、ユーザー名
ユーザーID=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
マイコムとは
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
.COMMANDTEXT = GETUSERNAME 'ストアドプロセス名を指定します
.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
。実行する
で終わる
ユーザー名 = MYCOMM(1)
MYCOMM = 何も設定しない
ID 1 ~ 10 を持つ 10 人のユーザーのユーザー名を取得したい場合、COMMAND オブジェクトを 10 回作成する必要がありますか?いいえ。同じストアド プロセスを複数回呼び出す必要がある場合は、入力パラメータを変更するだけで、異なる出力が得られます。
'**同じストアドプロセスへの複数の呼び出し**
DIM MYCOMM、ユーザーID、ユーザー名
ユーザー名=
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
ユーザーID = 1 ~ 10
マイコムとは
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
.COMMANDTEXT = GETUSERNAME 'ストアドプロセス名を指定します
.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
ユーザーID = 1の場合、その後
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
。実行する
それ以外
'入力パラメータに値を再割り当てします(この時点でパラメータ値が変化しない入力パラメータと出力パラメータは再宣言する必要はありません)
.PARAMETERS(@USERID) = ユーザーID
。実行する
終了 IF
で終わる
USERNAME = USERNAME + MYCOMM(1) + , '配列ストレージを使用したいのかもしれません
次
MYCOMM = 何も設定しない
上記のコードからわかるように、同じストアド プロセスを繰り返し呼び出す場合、値が変更された入力パラメータを再割り当てするだけで済みます。このメソッドには複数の入力パラメータと出力パラメータがあり、それぞれ 1 つの入力パラメータ値のみが呼び出されます。変更が発生した場合、コードの量を大幅に削減できます。
5. 戻り値、入力パラメータ、出力パラメータを同時に持つストアドプロセス
前述したように、ストアド プロセスを呼び出す場合、パラメータを宣言する順序は、ストアド プロセスで定義された順序と同じである必要があります。特に注意すべきもう 1 つの点は、ストアド プロセスに戻り値と入出力パラメーターの両方がある場合、戻り値を最初に宣言する必要があることです。
この場合の呼び出しメソッドを示すために、上記の例を改良してみましょう。 ID 1 のユーザーのユーザー名を引き続き取得しますが、ユーザーがそれを持っていない可能性があります (ユーザーは削除されており、USERID は自己増加フィールドです)。ストアドプロセスは、ユーザーがプロセスを持っているかどうかに応じて異なる値を返します。この時点で、ストアド プロセスと ASP コードは次のとおりです。
/*SP5*/
プロシージャ DBO.GETUSERNAME の作成
-- 順序の印象をより深くするために、次の 2 つのパラメータの定義の順序を逆にします。
@USERNAME VARCHAR(40) 出力、
@USERIDINT
として
ノーカウントをオンに設定
始める
@USERID が NULL の場合は戻ります
SELECT @ユーザー名=ユーザー名
DBO より。[ユーザー情報]
WHERE ユーザー ID=@ユーザー ID
IF @@ROWCOUNT>0
リターン1
それ以外
リターン0
戻る
終わり
行く
'**戻り値、入力パラメータ、および出力パラメータを使用してストアド プロセスを呼び出します**
DIM MYCOMM、ユーザーID、ユーザー名
ユーザーID=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
マイコムとは
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
.COMMANDTEXT = GETUSERNAME 'ストアドプロセス名を指定します
.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
'戻り値は最初に宣言する必要があります
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'それに応じて、次の 2 つのパラメータの宣言順序も逆になります。
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
。実行する
で終わる
MYCOMM(0) = 1の場合 THEN
ユーザー名 = MYCOMM(1)
それ以外
USERNAME = このユーザーは持っていません
終了 IF
MYCOMM = 何も設定しない
6. パラメータとレコードセットを同時に返すストアドプロセス
場合によっては、ストレージ プロセスがパラメーターとレコード セットを同時に返す必要がある場合があります。たとえば、ページングにストレージ プロセスを使用する場合、レコード セットと合計データ量などのパラメーターを同時に返す必要があります。以下は、ページング用のストアド プロセスです。
/*SP6*/
プロシージャ DBO.GETUSERLIST の作成
@IPAGECOUNT INT OUTPUT, --総ページ数
@IPAGE INT, --現在のページ番号
@IPAGESIZE INT --ページあたりのレコード数
として
ノーカウントをオンに設定
始める
-- 一時テーブルの作成
CREATE TABLE #T (ID INT IDENTITY、--自動インクリメントフィールド
ユーザーID INT、
ユーザー名 VARCHAR(40))
-- 一時テーブルにデータを書き込みます
#T に挿入
DBO からユーザー ID、ユーザー名を選択します。[ユーザー情報]
ユーザーIDによる注文
-- レコードの総数を取得します。
@IRECORDCOUNT INT を宣言する
SET @IRECORDCOUNT = @@ROWCOUNT
-- 総ページ数を決定します。
IF @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
それ以外
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
-- 要求されたページ番号が総ページ数より大きい場合は、最後のページが表示されます。
IF @IPAGE > @IPAGECOUNT
SELECT @IPAGE = @IPAGECOUNT
-- 現在のページの開始レコードと終了レコードを決定します。
DECLARE @ISTART INT --START RECORD
DECLARE @IEND INT --END RECORD
SELECT @ISTART = (@IPAGE - 1) * @IPAGESIZE
SELECT @IEND = @ISTART + @IPAGESIZE + 1
-- 現在のページレコードを取得します。
SELECT * FROM #T WHERE ID>@ISTART AND ID<@IEND
--一時テーブルの削除
ドロップテーブル #T
-- レコードの総数を返します。
戻ります @IRECORDCOUNT
終わり
行く
上記の保存処理では、現在のページ番号とページごとのレコード数を入力し、現在のページのレコードセット、総ページ数、総レコード数を返します。より一般的には、レコードの総数が戻り値として返されます。以下は、ストアド プロセスを呼び出す ASP コードです (特定のページング操作は省略されています)。
'**ページング ストレージ プロセスの呼び出し**
DIM ページナウ、ページサイズ、ページ数、レコード数
ディム・マイコム、MYRST
パゲナウ = リクエスト(PN)
'自然数を検証するために使用されるカスタム関数
CHECKNAR(PAGENOW) = FALSE の場合、PAGENOW = 1
ページサイズ = 20
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
マイコムとは
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
.COMMANDTEXT = GETUSERLIST 'ストアドプロセス名を指定
.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
'戻り値(総レコード数)
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'出力パラメータ(総ページ数)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'入力パラメータ(現在のページ番号)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'入力パラメータ(ページあたりのレコード数)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
SET MYRST = .EXECUTE
で終わる
IF MYRST.STATE = 0 THEN 'データは取得されませんでした。MYRST は閉じられています
レコード数 = -1
それ以外
MYRST.CLOSE '注: パラメータ値を取得するには、最初にレコードセット オブジェクトを閉じる必要があります
RECORDCOUNT = MYCOMM(0)
ページカウント = マイコム(1)
IF CINT(PAGENOW)>=CINT(PAGECOUNT) THEN PAGENOW=PAGECOUNT
終了 IF
MYCOMM = 何も設定しない
'以下のレコードを表示
レコード数 = 0 の場合、THEN
RESPONSE.WRITE レコードなし
ELSEIF RECORDCOUNT > 0 THEN
マイリストオープン
MYRST.EOFまで行う
...
ループ
'以下はページング情報を表示します
...
ELSE 'RECORDCOUNT=-1
RESPONSE.WRITEパラメータエラー
終了 IF
上記のコードに関して、説明が必要な点は 1 つだけです。レコードセットとパラメーターを同時に返す場合、パラメーターを取得したい場合は、最初にレコードセットを閉じてから、使用するときにレコードセットを開く必要があります。レコードセット。
7. 複数のレコードセットを返すストアド プロセス
この記事では、まず、レコードセットを返すストアド プロセスを紹介します。場合によっては、ストアド プロセスが複数のレコード セットを返す必要がある場合、ASP ではこれらのレコード セットを同時に取得するにはどうすればよいでしょうか。この問題を説明するために、USERINFO テーブルに USERTEL と USERMAIL という 2 つのフィールドを追加し、ログインしたユーザーのみがこれら 2 つのコンテンツを表示できるように設定します。
/*SP7*/
プロシージャ DBO.GETUSERINFO の作成
@USERIDINT、
@CHECKLOGINビット
として
ノーカウントをオンに設定
始める
@USERID が NULL または @CHECKLOGIN が NULL の場合、戻り値
ユーザー名を選択してください
DBO より。[USRINFO]
WHERE ユーザー ID=@ユーザー ID
-- ログインしているユーザーの場合は、USERTEL と USERMAIL を取得します。
@CHECKLOGIN=1の場合
USERTEL、USERMAILを選択してください
DBO より。[ユーザー情報]
WHERE ユーザー ID=@ユーザー ID
戻る
終わり
行く
ASP コードは次のとおりです。
'**複数のレコードセットを返すストアドプロセスを呼び出す**
DIM CHECKLG、ユーザーID、ユーザー名、USERTEL、USERMAIL
ディム・マイコム、MYRST
ユーザーID=1
'CHECKLOGIN() は、訪問者がログインしているかどうかを判断するカスタム関数です
CHECKLG = CHECKLOGIN()
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
マイコムとは
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR はデータベース接続文字列です
.COMMANDTEXT = GETUSERINFO 'ストアドプロセス名を指定
.COMMANDTYPE = 4 'これがストアドプロセスであることを示します
.PREPARED = TRUE '最初に SQL コマンドをコンパイルする必要があります
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
SET MYRST = .EXECUTE
で終わる
MYCOMM = 何も設定しない
'最初のレコードセットから値を取得します
ユーザー名 = MYRST(0)
' 2 番目のレコードセットから値を取得します
もしそうでないなら、MYRSTは何もない
SET MYRST = MYRST.NEXTRECORDSET()
ユーザーテル = MYRST(0)
USERMAIL = MYRST(1)
終了 IF
MYRST = 何も設定しない
上記のコードでは、RECORDSET オブジェクトの NEXTRECORDSET メソッドを使用して、ストレージ プロセスから返された複数のレコード セットを取得します。
これまで、この記事では、ASP がストアド プロセスを呼び出すさまざまな状況について比較的包括的に説明してきました。最後に、ASP プログラムで複数のストアド プロセスを呼び出すさまざまな方法について説明します。
ASP プログラムでは、少なくとも次の 3 つのメソッドで複数のストアド プロセスを呼び出すことができます。
1. 複数の COMMAND オブジェクトを作成する
ディミーコム
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'ストアドプロセス1を呼び出します
...
MYCOMM = 何も設定しない
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'ストアド プロセス 2 を呼び出します
...
MYCOMM = 何も設定しない
...
2. COMMAND オブジェクトを 1 つだけ作成し、通話を終了するときにそのパラメータをクリアします。
ディミーコム
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'ストアドプロセス1を呼び出します
……
'パラメータをクリアします (パラメータが 3 つあると仮定します)
MYCOMM.PARAMETERS.DELETE 2
MYCOMM.PARAMETERS.DELETE 1
MYCOMM.PARAMETERS.DELETE 0
'ストアド プロセス 2 を呼び出してパラメータをクリアします
...
MYCOMM = 何も設定しない
このとき、パラメータをクリアする順序とパラメータを宣言する順序が逆になることに注意してください。理由はわかりません。
3. PARAMETERS データ コレクションの REFRESH メソッドを使用して、PARAMETER オブジェクトをリセットします。
ディミーコム
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'ストアドプロセス1を呼び出します
……
'PARAMETERS データ コレクションに含まれるすべての PARAMETER オブジェクトをリセットします
MYCOMM.PARAMETERS.REFRESH
'ストアド プロセス 2 を呼び出します
……
MYCOMM = 何も設定しない
一般に、オブジェクトを繰り返し作成するのは効率が悪いと考えられていますが、テスト (テスト ツールは MICROSOFT APPLICATION CENTER TEST) 後、予期しない結果が得られます。
方法 2 >= 方法 1 >> 方法 3
方法 2 の実行速度は方法 1 以上 (最大約 4% 高速)、これら 2 つの方法の実行速度は方法 3 (最大 130%) よりも速いため、使用することをお勧めします。パラメータが多い場合は方法 1、そうでない場合は方法 2 を使用します。
ASP でストアド プロシージャを呼び出す際の私の表面的な経験の一部を最終的に文書化するのに 1 日かかりました。その中には、結果だけが分かっていて原因が分からないものもあり、間違っているものもあるかもしれませんが、これらは全て私個人の実践によるものです。読者の皆様、どうか批判的に受け止めてください。異なるご意見がございましたら、事前にお知らせください。