sql >> Database >  >> RDS >> Sqlserver

Typen SQL Server-cursor - Wat is het verschil tussen LOKALE EN GLOBALE cursor | SQL Server-zelfstudie / TSQL-zelfstudie

Lokale cursor:

De reikwijdte van Local Cursor is beperkt tot de batch, opgeslagen procedure of trigger waarin deze is gemaakt. Zodra de batch, opgeslagen procedure of trigger is voltooid. De lokale cursor is niet meer beschikbaar voor gebruik.

GLOBALE CURSOR:

De reikwijdte van GLOBAL Cursor is beperkt tot de verbinding waarin deze is gemaakt. U kunt GLOBAL CURSOR in meerdere batches gebruiken, u kunt als eerste openen en de gegevens als tweede ophalen. U kunt ook de GLOBALE CURSOR openen in één opgeslagen procedure en de gegevens ophalen in de volgende opgeslagen procedure, zolang ze dezelfde verbinding gebruiken.
Als u het trefwoord Local of Global niet zou gebruiken, wordt de cursor gemaakt met TYPE met behulp van de database-instelling zoals hieronder weergegeven.
Fig 1:Verschil tussen lokale cursor en globale cursor in SQL Server
Laten we maken een voorbeeldtabel en voeg enkele records in en voer een test uit om onze bovenstaande definitie te bewijzen.

--drop table dbo.Customer
Create table dbo.Customer ( 
CustomerId Int ,
CustomerName VARCHAR(100),
StreetAddress VARCHAr(100),
City VARCHAR(100),
State CHAR(2))
go

--Insert few Records in Sample Table
Insert into dbo.Customer
Select 1,'Aamir shahzad','Test Street Address','Charlotte','NC'
Union all
Select 2,'M Raza','Test Street Address','Charlotte','NC'
union all
Select 3,'John Smith','Test Street Address','New York City','NY'
union All
Select 4,'Christy Richard','Test Street Address','Rio Rancho','NM'




--Test with GLOBAL Cursor in Multiple Batches. 
use Test
go

DECLARE Customer_Cursor CURSOR 
--use LOCAL OR GLOBAL HERE
GLOBAL 
FOR
Select CustomerID,
CustomerName,
StreetAddress,
City,
State
from dbo.Customer
OPEN Customer_Cursor;
GO

--Terminate the Batch and change the Database 
use TestDB
go
FETCH NEXT FROM Customer_Cursor
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM Customer_Cursor 
   END
CLOSE Customer_Cursor;
GO
DEALLOCATE Customer_Cursor;
GO

We will be able to see the records as we have defined Cursor as GLOBAL and it will be 
available during entire Connection , even we have terminated the first Batch by using GO
statement.


Fig 2: Global Cursor in SQL Server
--Test with LOCAL Cursor in Multiple Batches. 
use Test
go

DECLARE Customer_Cursor CURSOR 
--use LOCAL OR GLOBAL HERE
LOCAL 
FOR
Select CustomerID,
CustomerName,
StreetAddress,
City,
State
from dbo.Customer
OPEN Customer_Cursor;
GO

--Terminate the Batch and change the Database 
use TestDB
go
FETCH NEXT FROM Customer_Cursor
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM Customer_Cursor 
   END
CLOSE Customer_Cursor;
GO
DEALLOCATE Customer_Cursor;
GO
 
 
As the scope for LOCAL Cursor is limited to Batch, Stored Procedure or Trigger, The second batch is not able to see the Cursor as we have defined LOCAL Cursor type in our above query
Fig 3:Lokale cursor in SQL Server
 

Laten we nu de test uitvoeren met Stored Procedure en kijken hoe Local Cursor en Global Cursor werken in Stored Procedure in SQL Server.
--Test with LOCAL Cursor in Multiple Batches. 
use Test
go

Create Procedure Dec_Cursor_Customer AS
BEGIN
DECLARE Customer_Cursor CURSOR 
--use LOCAL OR GLOBAL HERE
GLOBAL 
FOR
Select CustomerID,
CustomerName,
StreetAddress,
City,
State
from dbo.Customer
OPEN Customer_Cursor;
END

GO
Create Procedure Fetch_Cusor_Customer
AS 
BEGIN
FETCH NEXT FROM Customer_Cursor
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM Customer_Cursor 
   END
END

--Execute the Procedures to What we get with GLOBAL and LOCAL Cursor Type

EXEC Dec_Cursor_Customer
GO
EXEC Fetch_Cusor_Customer
CLOSE Customer_Cursor;
GO
DEALLOCATE Customer_Cursor;
GO
 
 
Als we de bovenstaande opgeslagen procedure uitvoeren, krijgen we de resultaten zoals we die in figuur 2 hebben gekregen. Omdat we declareren als GLOBAL type, kunnen we het in meerdere opgeslagen procedures gebruiken zolang u ze uitvoert in dezelfde aansluiting.

Ga je gang en wijzig de opgeslagen procedure en verander het type van GLOBAAL in Lokaal en voer vervolgens de procedures uit. Zelfs als we in dezelfde verbinding zijn, zullen we de fout krijgen die we in figuur 3 hebben gekregen. Omdat de reikwijdte van Cursor beperkt is tot Batch, Opgeslagen Procedure of Trigger als je eenmaal LOCAL definieert.
Videodemo:Bekijk de video om de gedetailleerde demo te zien hoe Local Cursor en Global Cursor werken.
  1. SQL Server CRUD-bewerkingen

  2. WAARDEN-clausule in SQL Server

  3. Waarde van weergave-item invullen bij query in Oracle Forms

  4. Hoe u de datum van gisteren in PostgreSQL kunt krijgen