< Refreshヘッダ | ADOでOracleのバインド変数つきPL/SQLを実行する >

November 26, 2003

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呼び出しをキチンと解説しているサイトが意外に少ないので、大へん参考になりました。
ありがとうございました。

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?