در بخش قبل کار با 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 :
2- برای شروع به کار با PL/SQL به چه چیزی نیاز داریم
5- کار با PL/SQL در ابزار PL/SQL Developer
6- معرفی انواع داده های PL/SQLمتداول
6،7- تعریف متغیر از نوع جدول (table)
6،8- تعریف متغیر از نوع آرایه (Array)
7،2- Explicit cursor (مکان نمای صریح)
7،3- Implicit cursor (مکان نمای غیر صریح یا ضمنی)
8 - پروسیجر یا Stored procedure
11- معرفی پکیج
11،1- ساخت پکیج در PL/SQL Developer
11،2- تست پکیج
معرفی اوراکل اپکس (oracle apex)