آموزش زبان PL/SQL (معرفی Cursor )- درس سوم ...

نوشته شده توسط :
آموزش زبان PL/SQL (معرفی Cursor )- درس سوم ...

در بخش قبل کار با PL/SQL در ابزار PL/SQL Developer و معرفی متغییر ها پرداخته شد لذا در این بخش از آموزش زبان PL/SQL به بررسی Cursor خواهیم پرداخت.

7- Cursor (مکان نمای)
7.1-  Cursor (مکان نمای)  چیست؟

Cursorیک نوع متغیر ساخت یافته  می باشد که به ما اجازه می دهد داده ها (در Sql)  را مورد پردازش قرار دهیم . در حقیقت یک cursor مکان کاری موقتی است که در حافظه سیستم جهت ذخیره سازی data استخراج شده از بانک اطلاعاتی استفاده می شود . لذا در طول پردازش، ما cursor را از طریق هر خط داده اداره می کنیم. این خط داده ها (data) توسط یک cursor مشخص شده است. با حرکت cursor، ما می توانید طیف از داده ها را از یک خط جاری استخراج کنیم. Cursor می تواند بیش از یک سطر را در خود نگه دارد، ولی در هر زمان فقط می توان بر روی یک سطر پردازش انجام داد. مجموعه سطر های نگه داری شده در Cursor را (مجموعه فعال) active set می گویند.

 

نحوه تعریف و پیاده سازی Cursor  : حالت اول : تعریف Cursor بدون پارامتر :

CURSOR <Cursor_Name>

IS

<Select_Statement>

حالت دوم : تعریف Cursor با پارامتر :

CURSOR <Cursor_Name>(<Parameter_List>)

IS

<Select_Statement>

مثال :

مثال اول : تعریف Cursor بدون پارامتر

Cursor Emp_Cur Is

 Select Emp.Emp_Id

       ,Emp.First_Name

       ,Emp.Last_Name

 From   Employee Emp;

مثال اول : تعریف Cursor با پارامتر

Cursor Emp_Cur(p_Dept_Id   Number

        ,p_Branch_Id Number)

Is

Select Emp.Emp_Id

   ,Emp.First_Name

   ,Emp.Last_Name

   ,Emp.Assigned_Branch_Id

   ,Emp.Dept_Id

From   Employee Emp

Where  (Emp.Dept_Id = p_Dept_Id Or p_Dept_Id Is Null)

And    (Emp.Assigned_Branch_Id = p_Branch_Id Or p_Branch_Id Is Null);

دو نوع از مکان نما (Cursor) وجود دارد:

 

1- Explicit cursor (مکان نمای صریح)

        این cursor ها زمانی که دستورات DML  مانند ،INSERT , UPDATE , DELETE  اجرا می شود ، ساخته خواهد شد.همچنین زمانی که یک دستور SELECT   فقط یک رکورد را برمی گرداند ، درست می شوند.

صفات

توضیحات

%ISOPEN

TRUE را برمی گرداند اگر مکان نما cursor باز باشد

%NOTFOUND

TRUE را برمی گرداند اگر مکان نما cursor هیچ خط بعدی وجود نداشته باشد.

FOUND% 

TRUE را برمی گرداند اگر مکان نما cursor هیچ خط بعدی وجود داشته باشد.

%ROWCOUNT

تعداد ردیف FETCH شده را برمی گرداند.

 

مراحل تعریف و استفاده از Explicit cursor :

 

Declare

--     تعریف یک  cursor با دو پارامتر.

    Cursor Emp_Cur

    (

        p_Dept_Id   Number

      ,p_Branch_Id Number

    ) Is

        Select Emp.Emp_Id

                ,Emp.First_Name

                ,Emp.Last_Name

                ,Emp.Assigned_Branch_Id

                ,Emp.Dept_Id

        From   Employee Emp

        Where  (Emp.Dept_Id = p_Dept_Id Or p_Dept_Id Is Null)

        And    (Emp.Assigned_Branch_Id = p_Branch_Id Or p_Branch_Id Is Null);

    ---

--      تعریف متغیر از نوع ROWTYPE، بر اساس مکان نما یا Cursor که ایجاد نموده ایم.

    v_Emp Emp_Cur%Rowtype;

    ---

    v_Dept_Id   Number := 1;

    v_Branch_Id Number;

    ---

    v_Row  Integer := 0;

    v_Open Boolean;

Begin

    -- بررسی اینکه مکان نما (Cursor)باز است ؟

    If Emp_Cur%Isopen Then

        Dbms_Output.Put_Line('Cursor opened');

    Else

        Dbms_Output.Put_Line('Cursor not open');

    End If;

    --

    Dbms_Output.Put_Line('Opening cursor...');

    -- Open Cursor (Pass input parameters).

    Open Emp_Cur(v_Dept_Id, v_Branch_Id);

    -- Using loop

    Loop

    -- دریافت ردیف از داده ها Cursor

        Fetch Emp_Cur

            Into v_Emp;

    -- شرط برای خروج از حلقه

        Exit When Emp_Cur%Notfound;

    -- پردازش داده ها

        v_Row := v_Row + 1;

        Dbms_Output.Put_Line(v_Row || ' - First_Name: ' || v_Emp.First_Name || ' - Last_Name: ' || v_Emp.Last_Name);

    End Loop;

    --

    Dbms_Output.Put_Line('Closing cursor...');

    -- بستن مکان نما (Cursor).

    Close Emp_Cur;

End;

در زیر نتیجه اجرای مثال بالا را می بینید.

 

2- Implicit cursor (مکان نمای غیر صریح یا ضمنی)

        این نوع از cursor زمانی که یک دستور SELECT  که بیش از یک سطر را برمی گرداند اجرا می شود ، باید ایجاد شوند. با توجه به اینکه cursor  ها قابلیت ذخیره چند رکورد را دارند ، ولی در یک زمان فقط یک رکورد را می تواند پردازش شود ، که به آن رکورد فعلی گفته می شود. وقتی یک سطر را FETCH  می کنید ، موقعیت رکورد فعلی به سطر بعد انتقال پیدا می کند.    

صفات

توضیحات

%NOTFOUND

مقدار برگشتی true است اگر دستور select ..into هیچ ردیفی را برنگرداند یا دستور DML  روی هیچ ردیفی تاثیر نداشته باشد

FOUND% 

مقدار برگشتی true است اگر دستور select ..into حداقل یک ردیف را برگرداند یا دستور DML حداقل بر روی یک ردیف تاثیر داشته باشد

%ROWCOUNT

تعداد ردیف های که توسط دستور DML  تغییر یا ساخته شده باشد.

 

استفاده از ‘for loop’، برای واکشی رکورد از cursor، با استفاده از دستور  زیر:

  FOR <v_Record> in <cursor_name>(<Parameter_values>) LOOP    -- Statements.. END LOOP;

 

به مثال زیر دقت کنید :

Declare

--     تعریف یک  cursor با دو پارامتر.

Cursor Emp_Cur(p_Dept_Id   Number

                ,p_Branch_Id Number) Is

     Select Emp.Emp_Id

           ,Emp.First_Name

           ,Emp.Last_Name

           ,Emp.Assigned_Branch_Id

           ,Emp.Dept_Id

     From   Employee Emp

     Where  (Emp.Dept_Id = p_Dept_Id Or p_Dept_Id Is Null)

     And    (Emp.Assigned_Branch_Id = p_Branch_Id Or p_Branch_Id Is Null);

  ---

  ---

  v_Dept_Id   Number := 1;

  v_Branch_Id Number;

  ---

  v_Row Integer := 0;

Begin

    -- بررسی اینکه مکان نما (Cursor)باز است ؟

 If Emp_Cur%Isopen Then

     Dbms_Output.Put_Line('Cursor opened');

  Else

     Dbms_Output.Put_Line('Cursor not open');

  End If

  --   استفاده از حلقه برای واکشی مکان نما

  -- بدون نیاز به : open/close/fetch.

 For v_Emp In Emp_Cur(v_Dept_Id

                      ,v_Branch_Id) Loop

     --

     v_Row := v_Row + 1;

     Dbms_Output.Put_Line(v_Row || ' - First_Name: ' || v_Emp.First_Name ||

                          ' - Last_Name: ' || v_Emp.Last_Name);

  End Loop;

End;

 نکته : در  مفهوم Explicit cursor در هنگام استفاده از آن شما نیاز به تعریف ساختار و  باز و بسته نمودن مکان نما (cursor) را دارید ولی در Implicit cursor ، شما نیاز به باز و بسته نمودن cursor ندارید.

 

آموزش PL/SQL :

1- معرفی

2- برای شروع به کار با PL/SQL به چه چیزی نیاز داریم

3- بررسی اجمالی PL / SQL

4- عبارات ساده PL / SQL

4.1- معرفی If-elsif-else

4.2- معرفی LOOP

4.3- معرفی FOR LOOP

4.4- معرفی WHILE LOOP

5- کار با PL/SQL در ابزار PL/SQL Developer

6- معرفی انواع داده های PL/SQLمتداول

6.1- نوع داده عددی در pl/sql

6.2- انواع داده متن

6،4- تعریف متغیر با type%

6،5- تعریف متغیر با Rowtype%

6،6- تعریف متغیر از نوع رکورد

6،7- تعریف متغیر از نوع جدول   (table)

6،8- تعریف متغیر از نوع آرایه (Array)

7- Cursor (مکان نمای)

7.1- Cursor (مکان نمای) چیست؟

7،2- Explicit cursor (مکان نمای صریح)

7،3- Implicit cursor (مکان نمای غیر صریح یا ضمنی)

8 - پروسیجر یا Stored procedure

9- توابع یا Function

10- تریگر Trigger

11- معرفی پکیج

11،1- ساخت پکیج در PL/SQL Developer

11،2- تست پکیج

معرفی اوراکل اپکس (oracle apex)