آموزش دستور cursor در 2019 sql server و نحوه کار با آن به زبانی ساده
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش کامل کار با Cursor ها در SQL Server 2019:
در این جلسه میخواهیم در مورد sql server cursor صحبت کنیم. cursorها به ما کمک میدهند که تا بتوانیم سطر به سطر روی جداول حرکت کنیم و اگر میخواهیم مرحله به مرحله کدهایمان را اجرا کنیم. cursorها درواقع یک اشاره گر هستند که کنار سطرهای یک جدول یا یک محتوا قرار میگیرند و یکی یکی روی آنها میتوانند حرکت کنند و روی هر سطری که قرار بگیرند میتوانیم به محتویات آن سطر دسترسی داشته باشیم. دو مدل cursor داریم : cursorهای معمولی و scroll cursorها.
برای درک بهتر این مبحث به مثالهای زیر توجه کنید:
مثال:
Cursorها مانند متغیرها تعریف میشوند و نوع داده آنها از جنس cursor میباشد.
شکل کلی دستور cursor:
در این مثال میخواهیم روی سطرهای جدول customers حرکت کنیم. برای اینکار سه متغیر برای فیلدهایی که میخواهیم اطلاعات آن را واکشی کنیم تعریف میکنیم و بعد یک cursor با نام cr تعریف میکنیم و با دستور for مشخص میکنیم که روی چه جدول و فیلدهایی میخواهیم حرکت کنیم. بعد از مشخص کردن جدول باید cursor را open و در انتها close کنیم و عملیاتی را که میخواهیم انجام دهیم بین دستور open و close قرار میدهیم و در انتها با دستور Deallocate اشاره گری را که تعریف کردهایم از حافظه پاک میکنیم. با دستور fetch هم اطلاعات سطرهای جدول را واکشی میکنیم.
Declare @fname nvarchar(100),@lname nvarchar(100),@stateCode tinyint
Declare cr Cursor
For(
Select [FName],[LName],[StateCode]
From Customers
)
Open cr
fetch next from cr into @fname,@lname,@stateCode
Print(@fname + ' '+ @lname + ' '+Cast(@stateCode as nvarchar(20)) )
Close cr
Deallocate cr
خروجی:
در اینجا تنها یک سطر از جدول را نمایش دادیم. برای حرکت روی تمام سطرهای جدول باید از دستور while استفاده کنیم. برای آشنایی با دستور while دو مثال را باهم بررسی میکنیم:
شکل کلی دستور while:
در این مثال اعداد 1 تا 10 را چاپ میکند.
Declare @i int =1
While(@i<=10)
begin
Print(@i)
Set @i+=1
End
مثال: در این مثال هربار هر عدد که نوبتش باشد را در متغیر sum میریزد و یک عدد به i اضافه میکند و در انتها sum را چاپ میکند.
Declare @i int =1
Declare @sum int =0
While(@i<=10)
begin
Set @sum+=@i
Set @i+=1
end
Print('Sum is : '+Cast(@sum as nvarchar))
خروجی:
مثال: در این مثال دستورات خود را در حلقه while قرار میدهیم تا سطر به سطر روی جدول حرکت کند و در انتها سطرها را نمایش دهد. صفت @@FETCH_STATUS یک مقدار برمیگرداند اگر مساوی 0 باشد یعنی هنوز به انتها جدول نرسیده است.
Declare @fname nvarchar(100),@lname nvarchar(100),@stateCode tinyint
Declare cr Cursor
For(
Select [FName],[LName],[StateCode]
From Customers
)
Open cr
fetch next from cr into @fname,@lname,@stateCode
while(@@FETCH_STATUS=0)
begin
Print(@fname + ' '+ @lname + ' '+Cast(@stateCode as nvarchar(20)))
fetch next from cr into @fname,@lname,@stateCode
end
Close cr
Deallocate cr
خروجی:
مثال: در این مثال میخواهیم سطرهای جدول را بروزرسانی کنیم و کنار محتوای فیلد Lname دو ستاره در سمت چپ و راست این فیلد قرار دهد.
با دستور for update of LName مشخص میکنیم که میخواهیم فیلد LName بروزرسانی شود.
با دستور where current of cr مشخص میکنیم ک عملیات آپدیت را روی هر سطری که cursor قرار دارد انجام دهد.
Declare @fname nvarchar(100),@lname nvarchar(100),@stateCode tinyint
Declare cr Cursor
For(
Select [FName],[LName],[StateCode]
From Customers
)
for update of LName
Open cr
fetch next from cr into @fname,@lname,@stateCode
while(@@FETCH_STATUS=0)
begin
update Customers
Set LName='*'+LName+'*'
where current of cr
fetch next from cr into @fname,@lname,@stateCode
end
Close cr
Deallocate cr
خروجی:
Scroll cursor: این امکان را به ما میدهند که بتوانیم متنوع تر حرکت کنیم. cursorهای معمولی یکی یکی روی سطرها حرکت میکردند. اما scroll cursor کمک میدهد که مثلا از یک جای خاص شروع کنیم و به جای اینکه یکی یکی، چندتایی حرکت کنیم.
مثال: تعریف scroll cursor مانند cursor معمولی میباشد با این تفاوت که باید کلمه scroll را قبل از cursor قرار دهیم.
با دستور fetch absolute 5 from cr مشخص میکنیم که چندتایی روی سطرهای جدول حرکت کند به عبارتی میزان پرش را مشخص میکند و میتوانیم از relative به جای absolute استفاده کنیم. relative موقعیت مکانی را نسبت به موقعیت فعلی مشخص میکند. در این مثال ابتدا 5 پرش انجام میدهد و یک سطر را چاپ میکند و و با دستور relative 3 پرش انجام میدهد و سطر بعدی را نمایش میدهد. مقادیر فیلد statecode هم جمع میکند و نمایش میدهد.
Declare @sum int =0
Declare @fname nvarchar(100),@lname nvarchar(100),@stateCode tinyint
Declare cr scroll Cursor
For(
Select [FName],[LName],[StateCode]
From Customers
)
Open cr
fetch absolute 5 from cr into @fname,@lname,@stateCode
while(@@FETCH_STATUS=0)
begin
Set @sum+=@stateCode
Print(@fname + ' '+ @lname + ' '+Cast(@stateCode as nvarchar(20)))
print(@sum)
fetch relative 3 from cr into @fname,@lname,@stateCode
end
Close cr
Deallocate cr
خروجی:
امیدواریم که این آموزش، برای شما دوستان درسمنی عزیز مفید باشد، درصورت سوال و یا مشکل میتوانید به انجمن پرسش و پاسخ مراجعه کنید. پیشنهادات و انتقادات خود را در بخش نظرات برای ما ارسال کنید.
امید آنکه بیش از پیش موفق و مؤید باشید.
نظرات دانشجویان
عالی بود
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.