الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Explicit Cursor

مغلق
بدأه honest في 27 أغسطس 2001 · 5 رد · 2,174 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أخواني الأعزاء تكلمنا فيما سبق عن Implicit Cursor وذكر وظائفه وبعض الأمثله عليه على الرابط :

http://arabteam.nicmatic.com/vb/showthread...3?threadid=3405

واليوم نتكلم عن بعض الأمثله للنوع الثاني Explicit Cursor وقد شرحنا ايضا هذا النوع في الوصله السابقه وللأهميه يرجى قراءت الدرس السابق قبل الدخول في هذا الدرس .

[C][F=Navy] ** إنشـاء Explicit Cursor ** [/F][/C]

DECLARE
      CURSOR emp_cursor IS 
           SELECT empno,ename from emp;
     بلأمكان ان تنشأ عدة كيرسرات معا
       CURSOR dept_cursor IS
            SELECT * FROM dept
             WHERE deptno =10;
BEGIN
..
..

واذا اردت ان تضع بعض المتغيرات قيجب ان تضعها قبل Cursor مثال :

DECLARE
      v_ename          emp.ename%TYPE;
      v_empno          emp.empno%TYPE;
      CURSOR emp_cursor IS
         SELECT  empno,ename FROM emp;
BEGIN
..
..

[C][F=Navy]فتح الـ Cursor[/F][/C]

OPEN  cursor_name;

[C][F=Navy]FETCH cursor_name[/F][/C]

لجلب قيم الصف الحالي وو ضعه في متغيرات لأخراجه

FETCH cursor_name INTO (variable1,........)

مثال :

DECLARE
   v_empno       emp.empno%TYPE;
   v_ename       emp.ename%TYPE;
    CURSOR emp_cursor IS 
       SELECT empno, enmae 
       FROM  emp;
BEGIN
   OPEN emp_cursor;
   FOR i  IN  1..10  LOOP
      FETCH emp_cursor  INTO  v_empno, v_ename
      ..
      ..
   END  LOOP;
END;

[C][F=Navy]إغـلاق الـ Cursor[/F][/C]

CLOSE cursor_name;
في المثال السابق لم يغلق الـ Cursor
ولأغلاقه 
..
..
END LOOP;
CLOSE emp_cursor;
END;

سوف اكمل باقي الشرح اليوم ان شاء الله .

والله من وراء القصد

ابو عبدالآله

#2

هل تذكر انه في درس Implicit Cursor تكلمنا عن بعض الوظائف التاليه :

[F=Navy]SQL%ISOPEN

SQL%NOTFOUND

SQL%FOUND

SQL%ROWCOUNT[/F]

ايضا تستخدم هذه الوظائف في Explicit Cursor والأختلاف يكون :

* نفرض انك انشأت Cursor واسميته ABC فيكون طريقة استخدامه كالتالي :

[F=Maroon]ABC%ISOPEN

ABC%NOTFOUND

ABC%FOUND

ABC%ROWCOUNT[/F]

مثال :

[C][F=Navy]ISOPEN[/F][/C]

..
..
IF NOT emp_cursor%ISOPEN THEN
    OPEN emp_cursor;
END IF;
..
..

[C][F=Navy]NOTFOUND and ROWCOUNT[/F][/C]

DECLARE
      v_empno                emp.empno%TYPE;
      v_ename                emp.ename%TYPE;
      CURSOR emp_cursor IS
           SELECT empno,ename FROM emp;
BEGIN
    OPEN emp_cursor;
    LOOP
          FETCH emp_cursor INTO v_empno, v_ename;
          EXIT WHEN emp_cursor%ROWCOUNT>10  OR  emp_cursor%NOTFOUND;
..
..
END LOOP;
  CLOSE emp_cursor;
END;

[C][F=Red]Cursors AND Records[/F][/C]

في درس PL/SQL RECORD شرحت ماذا تعني هذه الكلمه لذا يرجى الرجوع الى هذا الدرس .

قبل الشرح نبدأ بمثال :

DECLARE 
     CURSOR emp_cursor IS
          SELECT  empno, ename FROM emp;
     emp_record      emp_cursor%ROWTYPE;
BEGIN
     OPEN emp_cursor;
     LOOP
           FETCH emp_cursor INTO emp_record;
..
..
..

كل مايهمنا هنا انه تم إنشاء Record عن طريق Cursor (اذا لم يكن الشرح واضح اذهب الى درس PL/SQL Record )

مثال :

DECLARE 
     CURSOR emp_cursor IS
          SELECT  empno, ename FROM emp;
     emp_record      emp_cursor%ROWTYPE;
BEGIN
     OPEN emp_cursor;
     LOOP
           FETCH emp_cursor INTO emp_record;
           EXIT WHEN emp_cursor%NOTFOUND;
           INSERT INTO temp_list (empid, empname)
           VALUES (emp_record.empno,emp_record.ename);
     END LOOP;
     COMMIT;
     CLOSE emp_cursor;
END;
#3

الموظفون الذين رواتبهم اقل من 1000 ريال لهم زياده 1.1%

والموظفون الذين رواتبهم بين 1500 و 2500 لهم زياده 1.7%

وماعدا ذلك لهم زياده 1.8% .

 DECLARE
      CURSOR emp_cur IS SELECT empno,sal FROM emp;
      emp_rec      emp_cur%ROWTYPE;
BEGIN
     OPEN emp_cur;
     FETCH emp_cur INTO emp_rec.empno,emp_rec.sal;
     WHILE emp_cur%found LOOP
     IF emp_rec.sal<1000 THEN
             emp_rec.sal:=emp_rec.sal*1.1;
         ELSIF
              emp_rec.sal>1500 AND emp_rec.sal<2500 THEN
              emp_rec.sal:=emp_rec.sal*1.7;
         ELSE
              emp_rec.sal:=emp_rec.sal*1.8
     END IF
UPDATE emp
    SET sal=emp_rec.sal
    WHERE empno=emp_rec.empno;
    FETCH emp_cur INTO emp_rec.empno,emp_rec.sal;
    END LOOP;
CLOSE emp_cur;
END;

[F=Red]في الدرس القادم ان شاء الله نكمل مع[/F]

[M-l][F=Maroon]Cursors With Parameters[/F][/M]

#4

اخي honest

السلام عليكم ورحمة الله وبركاته

نشكرك على هذه الدروس ونامل منك ان تكملهاوتاتي بالمزيد وامل من المشرفين على الموقع ان يضيفوها الى قسم الدروس

وبارك الله فيك وفي كل من افاد في هذا الموقع

#5

شكرا لك ياأخ محمد

لم اكمل الشرح لأني كنت مسافر ولكني سوف اكمل الشرح وسوف ابدأ بموضوع جديد الا وهو : EXCEPTIONS ان شاء الله .

ولك تحياتي

اخوك ابو عبدالآله

#6

بارك الله فيك

مثال ممتاز

DECLARE 
CURSOR emp_cur IS SELECT empno,sal FROM emp; 
emp_rec emp_cur%ROWTYPE; 
BEGIN 
OPEN emp_cur; 
FETCH emp_cur INTO emp_rec.empno,emp_rec.sal; 
WHILE emp_cur%found LOOP 
IF emp_rec.sal<1000 THEN 
emp_rec.sal:=emp_rec.sal*1.1; 
ELSIF 
emp_rec.sal>1500 AND emp_rec.sal<2500 THEN 
emp_rec.sal:=emp_rec.sal*1.7; 
ELSE 
emp_rec.sal:=emp_rec.sal*1.8 
END IF 
UPDATE emp 
SET sal=emp_rec.sal 

WHERE empno=emp_rec.empno; 
FETCH emp_cur INTO emp_rec.empno,emp_rec.sal; 
END LOOP; 
CLOSE emp_cur; 
END;

ان شاء الله غدا سوف اكتب تعليمة جديدة

وهي مختصرة باصدار 10g

هذا الموضوع مغلق.

مواضيع مشابهة