ADOでストアドを使う
ASPで書くのが面倒な処理はDB側でプロシージャにしておくと便利な場合がある。
MSDEでプロシージャを作ってASPから呼び出してみた。
'ASP
Dim adoCmd
Set adoCmd = Server.CreateObject("ADODB.Command")
With adoCmd
.CommandText = "pCheckValid"
.CommandType = adCmdStoredProc
Set .ActiveConnection = adoConGRDB
.Parameters("@emp_cd") = strEmpCd
.Parameters("@require_admin") = "1"
Call .Execute()
End With
If Not IsNull(adoCmd.Parameters("@ret_msg")) Then
Call Response.Write(adoCmd.Parameters("@ret_msg"))
Set adoCmd = Nothing
Exit Sub
End If
ポイントは、CommandText, CommandTypeを設定後にActiveConnectionを設定すること。そうしないと、パラメータがうまくバインドしない。(なんで?)
ちなみに、パラメータにEmptyを渡すとそのパラメータは「省略された」物として扱われる。ASPのCOOKIEやRequest.Formなどの初期値もEmptyなので、その値をパラメータとして渡す場合は、プロシージャ側で初期値を設定しておくのがお勧めである。
※ プロシージャ側でデフォルト値が指定されていないパラメータを省略すると実行時エラーになってしまう。
プロシージャの中身は、こんな感じ(実際に使ったものをいろいろ省略したため変なプロシージャだが)
/* 認証を行った社員の、コンテンツへのアクセス権を調べる 社員表 EMP_TBL COLUMN TYPE PRIMARY ----------- ------------ ------- emp_cd CHAR(6) TRUE password CHAR(12) valid_from CHAR(8) TRUE valid_to CHAR(8) section_cd CHAR(7) admin_flg CHAR(1) emp_name VARCHAR(24) */ CREATE PROCEDURE pCheckValid @emp_cd CHAR( 6) = NULL, @require_admin CHAR( 1) = NULL, @ret_msg VARCHAR(50) = NULL OUTPUT AS BEGIN DECLARE @NOW_DATE CHAR(14) DECLARE @TODAY CHAR( 8) DECLARE @temp_emp_cd CHAR( 6) /* 日付を取得 */ SELECT @NOW_DATE = CONVERT(CHAR(8), GETDATE(), 112) + REPLACE(CONVERT(CHAR(8), GETDATE(), 114), ':', '') SET @TODAY = SUBSTRING(@NOW_DATE, 1, 8) /* ログイン情報を取得 */ DECLARE cursor_login CURSOR FOR SELECT emp_cd FROM EMP_TBL WHERE emp_cd = @emp_cd AND @TODAY BETWEEN valid_from AND ISNULL(NULLIF(RTRIM(valid_to), ''), @TODAY) AND admin_flg = ISNULL(@require_admin, admin_flg) OPEN cursor_login FETCH NEXT FROM cursor_login INTO @temp_emp_cd /* レコードあり */ IF @@FETCH_STATUS = 0 BEGIN /* OK */ RETURN END /* 戻りレコードなし */ SET @ret_msg = 'この情報にアクセスする権限がありません。' RETURN END
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/114
コメント
SQL/Serverでプロシージャを作ってASPから呼び出しかたは、
MSDEのと同じでしょうか。
SQL Server は未確認ですが、
SQL Server に制限を設けた無償提供版が MSDE なので、
基本的には同じで動くのではないかと思います。
もし、試されたらレポいただけるとありがたいです。
こんにちわ
ExcelVBA でも同様の方法でPL/SQLを呼び出すことができました。
ADOでPL/SQL呼び出しをキチンと解説しているサイトが意外に少ないので、大へん参考になりました。
ありがとうございました。