カーソルとは

5524 ワード

カーソルとカーソルの利点:
 
データベースでは、カーソルは非常に重要な概念です.カーソルは、テーブルから取得されたデータを操作する柔軟な手段を提供し、本質的には、カーソルは実際には複数のデータレコードを含む結果セットから1つのレコードを毎回抽出するメカニズムである.カーソルは常にSQL選択文に関連付けられます.カーソルは、結果セット(ゼロ、1、または関連する選択文によって取得された複数のレコード)と結果セットが特定のレコードのカーソル位置を指すためです.結果セットの処理を決定する場合は、その結果セットへのカーソルを宣言する必要があります.
 
カーソルはシステムがユーザーのために開設したデータバッファであり、SQL文の実行結果を保存するユーザーはSQL文でカーソルから記録を取得し、主変数に付与することができ、主言語に渡してさらに処理することができる.関係データベース管理システムは実質的に集合向けていることを知っている.MS SQL SERVERには、where句を使用して1つのレコードのみが選択されることを制限しない限り、テーブル内の単一レコードを記述する表現はありません.したがって,カーソルを用いて単一レコード向けのデータ処理を行う必要がある.このように、カーソルを使用すると、クエリ文selectが返すロー結果セットの各ローに対して、結果セット全体を同じ操作ではなく、アプリケーションが同じ操作または異なる操作を行うことができます.また、カーソル位置に基づいてテーブル内のデータを削除または更新する機能も提供します.また,カーソルこそ集合向けのデータベース管理システムと行向けのプログラム設計を結びつけ,2つのデータ処理方式がコミュニケーションできるようにする.
カーソルはデータセットの順序ループであり、特定の状況では非常に役に立ちますが、カーソルの効率は大きな問題です.しかし、データテーブルに数十万以上のデータがある場合、カーソルの効率は考慮されます.カーソルはこのような大きなテーブルで検索し続けることに相当するので、あなたが望む結果になるまで、実際にはあなたの特徴と特徴的にデータを取るのと同じですが、そのようにあなたも無数の可能性を挙げています.カーソルはこの場合、定義されたルールに従って自動的に行われます.
 
カーソルの作成:declare cursor 1 CURSOR FOR Select*from table 1
 
DECLARE   Employee_Cursor   CURSOR FOR SELECT   LastName,   FirstName   FROM   Northwind.dbo.Employees OPEN   Employee_Cursor FETCH   NEXT   FROM   Employee_Cursor WHILE   @@FETCH_STATUS   =   0 BEGIN       FETCH   NEXT   FROM   Employee_Cursor END CLOSE   Employee_Cursor DEALLOCATE   Employee_Cursor
 
ストアド・プロシージャでカーソルを使用するには、次の手順に従います.
CREATE PROCEDURE Proc_Syn_Data AS BEGIN     SET NOCOUNT ON;     DECLARE @ID varchar(50); DECLARE @Name varchar(100); DECLARE @keyID varchar(50); DECLARE @updatetime varchar(50); 1.カーソルDECLARE CUR_の宣言MonthID CURSOR FOR    SELECT SchoolID,SName FROM dbo.GK_SchoolInfo DECLARE CUR_MonthID2 CURSOR FOR   SELECT RAreasID,UpdateTime FROM dbo.GK_ResiAreasInfo 2.カーソルOPEN CUR_を開くMonthID  OPEN CUR_MonthID2 3.1つのカーソルから情報を検索し、独自のデータ処理を実現します.
 
FETCH CUR_MonthID
         INTO @ID,@Name FETCH CUR_MonthID2
      INTO @keyID,@updatetime WHILE @@FETCH_STATUS=0 BEGIN SELECT @ID=SchoolID,@Name=SName FROM dbo.GK_SchoolInfo SELECT @keyID=RAreasID,@updatetime=UpdateTime FROM dbo.GK_ResiAreasInfo FETCH NEXT FROM CUR_MonthID INTO @ID,@Name FETCH NEXT FROM CUR_MonthID2 INTO @keyID,@updatetime print('---'+@ID+'---'+@Name+'|---|'+@keyID+'****'+@updatetime)     END;  4.カーソルCLOSE CUR_を閉じるMonthID;  CLOSE CUR_MonthID2;  5.カーソルdeallocate CURの解放MonthID;  DEALLOCATE CUR_MonthID2;  END; exec Proc_Syn_Data;
 
@@FETCH_STATUSは、FETCH文によって実行された最後のカーソルの状態0 FETCH文を返すことに成功した.-1 FETCH文が失敗したか、ローが結果セットにありません.-2抽出された行は存在しません.@FETCH_STATUSは1つの接続上のすべてのカーソルに対してグローバルであるため@@FETCH_を慎重に使用するSTATUS.1つのFETCH文を実行した後、別のカーソルに対して別のFETCH文を実行する前に@@FETCH_をテストする必要があります.STATUS.@@@FETCH_STATUSの値は定義されていません.たとえば、ユーザーは、あるカーソルからFETCH文を実行し、別のカーソルの結果を開いて処理するストレージ・プロシージャを呼び出します.呼び出されたストアド・プロシージャから制御を返すと、@@FETCH_STATUSは、ストアド・プロシージャが呼び出される前のFETCH文の結果ではなく、ストアド・プロシージャで実行される最後のFETCH文の結果を反映する.
 
 
カーソルを使用して、ストレージ中にデータをループします.
 
CREATE PROCEDURE updatecount AS    DECLARE @flashID int    DECLARE favCounts CURSOR LOCAL SCROLL FOR          SELECT flashID  FROM flashs_Favorites OPEN favCounts FETCH NEXT FROM favCounts INTO@flashID/*1行目データを読み込む*/WHILE@@FETCH_STATUS = 0 BEGIN     update flashtable set favCount=favcount + 1 where flashID=@flashID     FETCH NEXT FROM favCounts INTO @flashID END CLOSE  favCounts DEALLOCATE favCounts GO
 
USE [AirRateMgt];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO


-- =============================================
CREATE PROCEDURE [GetRelatedAirport]
(@cityCode char(3)='', @apCodeList varchar(50) OUTPUT)
WITH 
EXECUTE AS CALLER
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	SET @apCodeList = ''

    DECLARE FILTER_CURSOR CURSOR DYNAMIC FOR 
	select AP.AirportCode from Airports as AP where AP.CityCode = @cityCode
	OPEN FILTER_CURSOR

	DECLARE @apcode char(3)
	DECLARE @filterfetch int
	FETCH FIRST FROM FILTER_CURSOR INTO @apcode
	SET @filterfetch = @@FETCH_STATUS
	WHILE @filterfetch = 0
		BEGIN
			IF @apCodeList = ''
				SET @apCodeList = @apcode
			Else
				SET @apCodeList = @apCodeList + ',' + @apcode
 
			FETCH NEXT FROM FILTER_CURSOR INTO @apcode
			SET @filterfetch = @@FETCH_STATUS
		END
	CLOSE FILTER_CURSOR
	DEALLOCATE FILTER_CURSOR
	
	IF @apCodeList = ''
		SET @apCodeList = @cityCode
	--select @apCodeList
END
GO

 
 
物事と例外を含むカーソル:
OPEN FILTER_CURSOR

	BEGIN TRY
		BEGIN TRANSACTION 
		FETCH FIRST FROM FILTER_CURSOR INTO @id
		SET @filterfetch = @@FETCH_STATUS
		WHILE @filterfetch = 0
			BEGIN
			   ......
			FETCH NEXT FROM FILTER_CURSOR INTO @id
				SET @filterfetch = @@FETCH_STATUS
			END		
		SET @success = 1
		COMMIT TRANSACTION
	END TRY
	BEGIN CATCH
		PRINT 'errno: ' + ltrim(str(error_number()))
		PRINT 'errmsg: ' + error_message()
		IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION 
		SET @success = 0
	END CATCH

CLOSE FILTER_CURSOR
DEALLOCATE FILTER_CURSOR
END
GO

  ...