| 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