カーソルとは
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
物事と例外を含むカーソル:
...
データベースでは、カーソルは非常に重要な概念です.カーソルは、テーブルから取得されたデータを操作する柔軟な手段を提供し、本質的には、カーソルは実際には複数のデータレコードを含む結果セットから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
...