MSDE FunClub | 最終更新日 : 2000/08/18 | |
Microsoft Data Engine FunClub |
|
|
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