MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/08/18
Microsoft Data Engine FunClub
Since 2000.08.18
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻)
【第7章412p 〜 415p掲載】

-- [SQL07_03.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--        SET @カーソル変数名 = ローカルカーソル名
--        SET @カーソル変数名 = カーソル変数
-- の実行例です
--

-- カレントデータベースを MySampleTest にする
    USE MySampleTest
GO

-- (件処理されました)のメッセージを抑止する
    SET NOCOUNT ON
GO

-- ***********************************************************
--   ローカルカーソルへの参照を返す一時ストアドプロシージャ
-- ***********************************************************
    -- 一時ストアドプロシージャは、tempdbに作成されます
    -- OBJECTPROPERTY はカレント(現在)の接続先データベースの調査を行なう
    -- カレントデータベースを調査する前に tempdb に変更します
    USE tempdb
    IF( (object_id('tempdb..#PROC_SETCUR') IS NOT NULL) AND
         OBJECTPROPERTY( object_id('tempdb..#PROC_SETCUR'),'IsProcedure') = 1 )
       BEGIN
             PRINT '#PROC_SETCUR プロシージャが存在したので削除しました'
             DROP PROCEDURE #PROC_SETCUR
       END
    -- 元の接続先データベースに戻す
    USE MySampleTest
GO
    CREATE PROCEDURE #PROC_SETCUR
             @st    int ,                     -- 社員コードの検索開始位置
             @ed    int ,                     --       検索終了位置
             @cur   CURSOR VARYING  OUTPUT    -- 呼び出し元変数に書き込みます
    AS
        DECLARE @flag  smallint
        SET NOCOUNT ON

        -- ローカルカーソルを定義する
        -- 検索範囲がパラメータで指示されます
        DECLARE My_cur CURSOR
        LOCAL
        FOR SELECT 社員コード,氏名 FROM MySampleTest..社員 
            WHERE (社員コード BETWEEN @st AND @ed )
            order by 社員コード

        -- ローカルカーソルを開く
        OPEN My_cur

       -- カーソル状況の調査
        SET @flag = CURSOR_STATUS( 'local' , 'My_cur' )
        IF @flag = 1
           BEGIN
                 PRINT ''
                 PRINT '010:' + 'ローカルカーソルへの名前参照My_curができました(レコード有り)'
           END
        ELSE IF @flag = 0
           BEGIN
                 PRINT '090:開いたカーソルに、結果セットがありません。空です。'
                 CLOSE My_cur        -- 今開いたものを閉じる
                 DEALLOCATE  My_cur  -- 参照を破棄する
                 RETURN 1
           END


        -- 呼び出し元に、このローカルカーソルへの参照を書き込む
        -- オープンしたカーソルを、呼び出し元引数が参照します
        SET @cur = My_cur
        PRINT '020:' + 'ストアドプロシージャの引数に、カーソル参照を戻しました'

        -- 名前による参照は破棄するが、カーソル変数によって参照は継続中
        DEALLOCATE  My_cur
        IF CURSOR_STATUS( 'local' , 'My_cur' ) = -3
           BEGIN
                 PRINT '030:' + 'ローカルカーソルへの名前参照My_curを破棄しました'
           END
        RETURN 0
GO


-- *****************************************************
--         OPEN済みのローカルカーソル代入を行なう
-- *****************************************************
    DECLARE  @mycur   CURSOR
    DECLARE  @mycur2  CURSOR
    DECLARE  @社員コード int , @氏名 varchar(40)

    -- ストアドプロシージャ内でカーソルを定義する
    EXEC #PROC_SETCUR 0 , 9999 , @mycur OUTPUT
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = 1
       BEGIN
            PRINT '040:' + 'プロシージャの呼び出し元でもカーソル変数が使えます'
            FETCH NEXT FROM @mycur INTO @社員コード , @氏名 
            PRINT '    社員コード=[' + LTRIM(STR(@社員コード)) 
                  + '] 氏名=[' + @氏名 + ']'
       END

    -- カーソルを閉じる
    CLOSE  @mycur
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = -1
       BEGIN
            PRINT '050:' + 'カーソルを閉じました'
       END

    -- カーソル参照のコピーを行なう
    SET @mycur2 = @mycur

    -- 再オープンすることができる
    OPEN   @mycur2
    IF CURSOR_STATUS( 'variable' , '@mycur2' ) = 1
       BEGIN
            PRINT '060:' + 'カーソルを再オープンしました'
            FETCH NEXT FROM @mycur2 INTO @社員コード , @氏名 
            PRINT '    社員コード=[' + LTRIM(STR(@社員コード)) 
                  + '] 氏名=[' + @氏名 + ']'
        END

    -- カーソルを閉じる
    CLOSE  @mycur2

    -- カーソル変数による参照を破棄する
    DEALLOCATE  @mycur
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = -2
      BEGIN
           PRINT '070:' + 'カーソル変数@mycur のカーソル参照を破棄しました'
      END

    DEALLOCATE  @mycur2
    IF CURSOR_STATUS( 'variable' , '@mycur2' ) = -2
      BEGIN
           PRINT '080:' + 'カーソル変数@mycur2のカーソル参照を破棄しました'
      END

GO


-- *****************************************************
--          結果セットが得られない場合の例です
-- *****************************************************
    DECLARE  @mycur   CURSOR

    -- ストアドプロシージャ内でカーソルを定義する
    -- 但し検索範囲がおかしいため、結果セットは得られません
    PRINT ''
    EXEC #PROC_SETCUR  -9999 , 0 , @mycur OUTPUT
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = -2
       BEGIN
            PRINT '100:' + 'カーソル変数は定義されませんでした'
       END
GO

-- *************
--     掃除
-- *************
  DROP PROCEDURE #PROC_SETCUR      
GO




技術評論社の書籍ガイドへ
上巻:ISBN4-7741-0965-7

ウィンドウを閉じる


(株)日本技術ソフト開発 責任編集:堀川 明
MSDE FunClubに関するご意見・ご要望等ございましたら、 msdefun@horikawa.ne.jp までご連絡下さい。
HOME: http://www.horikawa.ne.jp/msde/


MSDE FunClubの運営は、マイクロソフト社とは一切の関係はありません