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