مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش استفاده Cursor در SQL Server برای پیمایش سطر به سطر

زبان SQL بر مبنای مجموعه ها کار می‌کند به طوری که مثلاً دستور select یک مجموعه از سطرها را که مجموعه جواب نام دارد را برمی گرداند. اما بعضی وقت‌ها لازم است که نتیجه را سطر به سطر پردازش کنیم. اینجاست که نیاز به مفهومی در SQL به نام Cursor به وجود می آید. که در این مطلب به توضیح این مفهوم می پردازیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
سرفصل های این مطلب
  1. Cursor چیست؟
  2. مثال واقعی‌تر از Cursor

Cursor چیست؟

نشانگر یا cursor شیئی است که امکان پیمایش سطر به سطر روی مجموعه نتایج را فراهم می‌کند. روش کار کردن cursor به شکل زیر است.

آموزش استفاده Cursor در SQL Server برای پیمایش سطر به سطر

قدم اول تعریف یک 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;

مثال واقعی‌تر از Cursor

در این بخش ما یک کوئری 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 و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات