| 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