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

-- [SQL07_02.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--        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
             @cur   CURSOR VARYING  OUTPUT    -- 呼び出し元変数に書き込みます
    AS
        SET NOCOUNT ON

        -- グローバルカーソルMy_cur が存在しないときは、何も実行しない
        IF CURSOR_STATUS( 'global' , 'My_cur' ) = -3  RETURN 1

        -- グローバルカーソルへの参照を返します
        -- 但しそのカーソルが開いていないと、呼び出し元では使えません
        SET @cur = My_cur
        RETURN 0
GO

-- *****************************************************
-- 調査例1:まだグローバルカーソル My_cur が存在しない
-- *****************************************************
    DECLARE @mycur CURSOR
    EXEC #PROC_SETCUR @mycur OUTPUT
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = -2
       BEGIN
           PRINT ''
           PRINT '010:' + 
                 'グローバルカーソルが存在しないか閉じられています。' +
                 'カーソル参照定義は失敗'
           RETURN
       END
GO

-- ****************************************************************
--  もし同じ名前のグローバルカーソルが存在したらその名前を破棄する
-- ****************************************************************
    DECLARE @flag smallint
    SET @flag = CURSOR_STATUS( 'global' , 'My_cur' )
    IF ( (@flag=0) OR (@flag=1) ) CLOSE      My_cur -- OPEN中なので閉じる
    IF (       @flag <> -3      ) DEALLOCATE My_cur -- 破棄する
GO

-- *******************************************************
--               グローバルカーソルを作成する
-- *******************************************************
    DECLARE My_cur CURSOR
    GLOBAL
    FOR SELECT 社員コード,氏名 FROM MySampleTest..社員 order by 社員コード
GO

-- *****************************************************
-- 調査例2:未openのグローバルカーソル代入は許されません
-- *****************************************************
    DECLARE @mycur CURSOR
    EXEC #PROC_SETCUR @mycur OUTPUT
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = -2
       BEGIN
           PRINT '020:' + 
                 'グローバルカーソルが存在しないか閉じられています。' +
                 'カーソル参照定義は失敗'
           RETURN
       END
GO

-- *****************************************************
-- 調査例3:open済みのグローバルカーソル代入を行なう
-- *****************************************************

    OPEN My_cur -- グローバルカーソルをOPENします

    DECLARE @mycur CURSOR
    EXEC #PROC_SETCUR @mycur OUTPUT
    IF CURSOR_STATUS( 'variable' , '@mycur' ) = 1
       BEGIN
            PRINT '030:' + 'カーソルへの参照ができました(レコード有り)'
       END

    -- グローバルカーソルを閉じる
    -- カーソル変数を使って閉じることができる
    CLOSE @mycur
    IF CURSOR_STATUS( 'global' , 'My_cur' ) = -1
       BEGIN
            PRINT '040:' + 'グローバルカーソル My_cur は閉じています'
       END

    -- カーソル変数による参照を破棄する
    DEALLOCATE  @mycur

    -- 名前を使った参照は生きていますので、再オープンができます
    OPEN My_cur
    IF CURSOR_STATUS( 'global' , 'My_cur' ) = 1   -- =0の時はレコードセットは空
       BEGIN
            PRINT '050:' + 'グローバルカーソル My_cur を再オープン(レコード有り)'
       END

    -- 名前を使って、グローバルカーソルを閉じる
    CLOSE My_cur
    IF CURSOR_STATUS( 'global' , 'My_cur' ) = -1
       BEGIN
            PRINT '060:' + 'グローバルカーソル My_cur を閉じました'
       END


    -- カーソル名による名前を使った参照を破棄する
    DEALLOCATE  My_cur
GO

-- *************
--   終了確認
-- *************
  IF CURSOR_STATUS( 'global' , 'My_cur' ) = -3
    BEGIN
           PRINT '070:' + 'グローバルカーソル My_cur は存在しません'
    END
  DROP PROCEDURE #PROC_SETCUR      
GO




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

ウィンドウを閉じる


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


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