زبان SQL بر مبنای مجموعه ها کار میکند به طوری که مثلاً دستور select یک مجموعه از سطرها را که مجموعه جواب نام دارد را برمی گرداند. اما بعضی وقتها لازم است که نتیجه را سطر به سطر پردازش کنیم. اینجاست که نیاز به مفهومی در SQL به نام Cursor به وجود می آید. که در این مطلب به توضیح این مفهوم می پردازیم.
نشانگر یا cursor شیئی است که امکان پیمایش سطر به سطر روی مجموعه نتایج را فراهم میکند. روش کار کردن cursor به شکل زیر است.
قدم اول تعریف یک cursor است: برای این کار به شکل زیر با استفاده از کلمه کلیدی cursor یک cursor تعریف می کنیم.
DECLARE cursor_name CURSOR
FOR select_statement;
دقت کنید که در قسمت select_statement باید دستور select مورد نظر را بنویسیم. بعد از اینکه cursor را تعریف کردیم باید آن را با استفاده از دستور open باز کنیم مانند کد زیر
OPEN cursor_name;
حال باید به ازای هرکدام از ستونهای نتیجه select که یک متغیر داشته باشیم و یک سطر را با استفاده از cursor استخراج کرده و آن را داخل متغیر ها بریزیم مانند کد زیر
FETCH NEXT FROM cursor INTO variable_list;
در SQL Server میتوان با استفاده از تابع @@FETCHSTATUS فهمید که وضعیت آخرین cursor به چه حالتی است که اگر نتیجه این تابع صفر باشد به این معنی است که داده ها با موفقیت در cursor قرار گرفته است. حال با وجود این تابع میتوان از حلقه while استفاده کرد تا همه سطرهای مجموعه را تک تک پیمایش کرد مانند کد زیر
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM cursor_name;
END;
بعد از اینکه کار ما با cursor تمام شد باید آن را ببندیم که از دستور close استفاده میکنیم مانند کد زیر
CLOSE cursor_name;
و در پایان باید متغیر cursor را آزاد کنیم مانند کد زیر:
DEALLOCATE cursor_name;
در این بخش ما یک کوئری select داریم که نتیجه آن دو ستون نام و قیمت محصول می باشد. حال با استفاده از cursor این دو ستون را استخراج کرده و آن را داخل دو متغیر که تعریف کردهایم میریزیم و بعد از آنها استفاده می کنیم.بخش اول کار به شکل زیر است:
DECLARE
@product_name VARCHAR(MAX),
@list_price DECIMAL;
DECLARE cursor_product CURSOR
FOR SELECT
product_name,
list_price
FROM
production.products;
سپس cursor را باز می کنیم.
OPEN cursor_product;
حال هر کدام از سطر ها را خوانده و در خروجی چاپ میکنیم با استفاده از کد زیر
FETCH NEXT FROM cursor_product INTO
@product_name,
@list_price;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @product_name + CAST(@list_price AS varchar);
FETCH NEXT FROM cursor_product INTO
@product_name,
@list_price;
END;
بعد از اتمام کار cursor را میبندیم
CLOSE cursor_product;
و در نهایت آن را از حافظه آزاد می کنیم.
DEALLOCATE cursor_product;
با وب سایت Tosinso همراه باشید.
نویسنده مهدی عادلی فر
منبع: جزیره بانک های اطلاعاتی Tosinso
بنیانگذار توسینسو و برنامه نویس
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.