undo بتاريخ: 11 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 11 يناير 2005 السلام عليكمحالياً اقوم بدراسة الاوراكل و بدأت مؤخراً في الPL/SQL و ووجدت انه على عكس الSql لا يمكنك استخدام الselect للحصول على اكثر من row واحد فحسب,, لو عايز اكثر من row فعليك استخدام الcursorاللغز كيف يمكنك من procedure و عن طريق السيكول و بدون الcursors عرض جميع الصفوف في جدول؟؟مثال: عرض اسماء الموظفين في جدول scott.empتم تغيير عنوان الموضوع ليدل على محتواه , راجع شروط الكتابه في المتنديإداره المنتدي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
AdNaN بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 <span style='font-family:Traditional Arabic'></span> بسم الله الرحمن الرحيم حقيقة أخ UNDO وحسب معلوماتي المتواضعه فأنة يمكنك الحصول على اكثر من ROW باستخدام Select في داخل الفورمولكن المشكلة تكمن في انه كيف يمكننا أخبار الديفيلوبر ان يأخذ كل Row ثم يضعه في سجل على الشاشة تابع ل بلوك ما. ثم يأتي بال Row الثاني ويضعه في السجل الثاني في نفس البلوك ... وهكذالحل هذه المشكلة فاننا نحتاج هنا لاستخدام cursor حيث سيقوم هذاcursor بارجاع one Row في كل مرة وحتى نضع Row ألثاني في السجل الثاني في البلوكفاننا نستخدم الأمر Next_Record في هذا البلوكأعتقد أصبحت النقطة واضحه الأن اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 (معدل) create or replace procedure print_all_empisv_count number :=0;v_id s_emp.id%type;v_last_name s_emp.last_name%type;beginselect count(*) into v_count from s_emp;for i in 1..v_count loopselect id, last_name into v_id, v_last_namefrom s_empwhere id = i;dbms_output.put_line(v_id ||' '||v_last_name);end loop;end;/ تم تعديل 12 يناير 2005 بواسطة Osama Soliman اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 (معدل) السلام عليكم ،،الأخ / اسامه شكرا على المثال .. واسترجاع بيانات الجدول يعتمد على رقم الموظف وبافتراض ان ارقام الموظفين فى تسلسل مستمر اى ( 1-2-3-4-5 ) ولكن فى حالة عدم وجود موظف رقم 3 مثلا .. فلن ترجع بيانات للمسلسل رقم 3 .. اعتقد انه لن يمكن تنفيذ هذا الامر مع جدول emp فى scott لان ارقام الموظفين غير مسلسله ..اي بمعنى اخر .. اذا كان البحث من جدول ليس به ارقام مسلسله مثل رقم الموظف .. فما هو الحل ؟؟شكرا لك مقدما تم تعديل 12 يناير 2005 بواسطة Amgad اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
h_elshawaf بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 عن طريق الـ cursor for loopcreate or replace procedure print_all_empisbeginfor i_rec in (select id, last_namefrom s_emp) loopdbms_output.put_line(i_rec.id||' '||i_rec.last_name);end loop;end;/ أدرى بأن هناك فجرا .. وأن بعد العسر يسرالكنهم ساموا الفتى وبلاده عسفا وقهراوالعالم الحيران يشهد ما يحل بأمتىوأنا هنا .. فى غربتى .. فى لوعتىأبكى وأمسح فى ذهول دمعتىوأظل أنظر للسماء .. والقلب يخفق بالدعاءيارب .. أوقظ أمتى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
undo بتاريخ: 12 يناير 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 فأنة يمكنك الحصول على اكثر من ROW باستخدام Select في داخل الفورمولكن المشكلة تكمن في انه كيف يمكننا أخبار الديفيلوبر ان يأخذ كل Row ثم يضعه في سجل على الشاشة تابع ل بلوك ما.ثم يأتي بال Row الثاني ويضعه في السجل الثاني في نفس البلوك ... وهكذالحل هذه المشكلة فاننا نحتاج هنا لاستخدام cursor حيث سيقوم هذاcursor بارجاع one Row في كل مرةوحتى نضع Row ألثاني في السجل الثاني في البلوك و الله انا ذو المعلومات المتواضعة انا لا ادري شيئاً عن الاوراكل فورمز و لكني تكلمت من خلال علمي البسيط في الpl/SQL .. المطلوب هو STORED PROCEDUREاخي اسامة::كلام امجاد سليم للغاية.. انا ابحث عن كود ينفع مع اي جدول و بدون الاعتماد حتى على أي حقل في الجدول..أخي الشواف: :D برضه استخدمت CURSOR رغم انه IMPLICIT .. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 اخى امجد فعلاً كلام صحيح مائة بمائة والمفروض فى هذه الاحوال استخدام Cursorوهو الحل الامثلCREATE OR REPLACE PROCEDURE PRINT_10 ISv_empno s_emp.id%TYPE;v_ename s_emp.last_name%TYPE;CURSOR emp_cursor ISSELECT id, last_nameFROM s_emp;BEGINOPEN emp_cursor;FOR i IN 1..10 LOOPFETCH emp_cursor INTO v_empno, v_ename;DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)||’ ’|| v_ename);END LOOP;CLOSE emp_cursor;END ; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 مثال اخر :DECLARECURSOR emp_cur ISSELECT id, last_name,salaryFROM s_emp;emp_rec emp_cur%ROWTYPE;BEGINOPEN emp_cur;LOOPFETCH emp_cur INTO emp_rec;EXIT WHEN emp_cur%NOTFOUND;INSERT INTO emp_history (id,name,salary)VALUES (emp_rec.id, emp_rec.last_name,emp_rec.salary);END LOOP;COMMIT;CLOSE emp_cursor;END; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 واقرا هذه الطريقة فهى مهمة جداCursor FOR LoopsA cursor FOR loop processes rows in an explicit cursor. It is a shortcut because The cursor is opened Rows are fetched once for each iteration in the loop The loop exits when the last row is processed The cursor is closed automatically. The loop itself is terminated automatically at the end of the iteration where the last row is fetched.Syntax:FOR record_name IN cursor_name LOOPstatement1;statement2;. . .END LOOP;Where record_name is the name of the implicitly declared record.cursor_name is a PL/SQL identifier for the previously declared cursor.Guidelines: Do not declare the record that controls the loop because it is declared implicitly. Test the cursor attributes during the loop, if required. Supply the parameters for a cursor, if required, in parentheses following the cursor name in the FOR statement. More information on cursor parameters is covered in a subsequent lesson. Do not use a cursor FOR loop when the cursor operations must be handled explicitly.Note: You can define a query at the start of the loop itself. The query expression is called a SELECT substatement, and the cursor is internal to the FOR loop. Because the cursor is not declared with a name, you cannot test its attributes. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 12 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 (معدل) واخيراً اليك هذا المثال :ExampleCREATE OR REPLACE PROCEDURE PRINT_DEPT_EMP(p_dept_id S_DEPT.ID%TYPE) ISCURSOR emp_cur ISSELECT id, last_name, salary,dept_idFROM s_emp;BEGINFOR emp_rec IN emp_cur LOOPIF emp_rec.dept_id = p_dept_id THENDBMS_OUTPUT.PUT_LINE (’Employee data : ’ || emp_rec.last_name||emp_rec.salary);END IF;END LOOP; END ;When you use a subquery in a FOR loop, you do not need to declare a cursor. CREATE OR REPLACE PROCEDURE PRINT_DEPT_EMP_2(p_dept_id S_DEPT.ID%TYPE) ISBEGINFOR emp_rec IN (SELECT id, last_name, salary,dept_id FROM s_emp) LOOPIF emp_rec.dept_id = p_dept_id THENDBMS_OUTPUT.PUT_LINE (’Employee data : ’ || emp_rec.last_name||emp_rec.salary);END IF;END LOOP; END ; تم تعديل 13 يناير 2005 بواسطة Osama Soliman اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
undo بتاريخ: 12 يناير 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 12 يناير 2005 السلام عليكمالحلول صحيحة لكن كلها باستخدام الCURSORS .. انا لا اريد استخدام اي CURSOR ..لكن اقرب الحلول لما اقصده هو حلك الأول يا اسامة و ليس حلولك التالية.. ففي الحل الأول استخدمت SELECT فقط في حلقة تكرارية و لكن لم تستطع التغلب على مشكلة الوصول للصفوف بصورة متتالية بدون الاعتماد على الجدول نفسه.. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 16 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 16 يناير 2005 والله اخى undo الحلول التالية تعتمد فعلا على الـ Cursor وقصدت بالمشاركة بها توضيح فوائد الـ Cursor وانصح كل الاخوة الاعضاء الذين لا يستخدمون الـ Cursor عليهم بالبحث فى موضوعه 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
undo بتاريخ: 16 يناير 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 يناير 2005 للرفع..اللغز ليس اختبار للمعلومات و لكن للتفكير و أعتقد ان المشكلة هنا انكم تحاولون استخدام معلوماتكم هنا..انا عارف ان اللغز مستفز و لكن هذه هي أضمن طريقة لكي أجد من يحله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
h_elshawaf بتاريخ: 17 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 17 يناير 2005 السلام عليكم ورحمة الله وبركاتهأخى العزيزبداية يستحيل بكل الطرق الممكنة عمل ما تريد بدون استخدام الcursorبل لا يمكن عمل استعلام أو ما شابه فى الأوراكل بدون استخدام الcursorوذلك لأن لتنفيذ الاستعلام يقوم الاوراكل بفتح implicit cursor حتى لو كان استعلام بسيط عباره عن جملة select فقطلذا فإن عمل cursor forloop هو الأقرب لما تريد .أما فكرتك نفسها فقد فكرت فيها فى بداية تعلمى للغة الpl/sql وفكرت فى انى لا استخدم الexplicit cursor ولكن استخدم correlated subquery حتى استطيع أن أمر على قيمه قيمه من الجدول مع العلم أن هذا سيتطلب من أوراكل فتح implicit cursorولكن لأبقى معك فى كلامك ونكتفى بجمل الselect بغض النظر عن الimplicit cursor ولكن أنا لم أخرج من حيز التفكير الى حيز التنفيذمجرد فكره ربما يكون لديك الوقت لتجربتها .شكرا لهذا اللغز .والى الغاز اخرى والسلام خير ختامأدرى بأن هناك فجرا .. وأن بعد العسر يسرالكنهم ساموا الفتى وبلاده عسفا وقهراوالعالم الحيران يشهد ما يحل بأمتىوأنا هنا .. فى غربتى .. فى لوعتىأبكى وأمسح فى ذهول دمعتىوأظل أنظر للسماء .. والقلب يخفق بالدعاءيارب .. أوقظ أمتى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
undo بتاريخ: 18 يناير 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 18 يناير 2005 (معدل) وذلك لأن لتنفيذ الاستعلام يقوم الاوراكل بفتح implicit cursor حتى لو كان استعلام بسيط عباره عن جملة select فقطلذا فإن عمل cursor forloop هو الأقرب لما تريد . و الله كلامك سليم 100% و فعلاً انتبهت لهذه النقطة ...و ايضا تنبؤك سليم لأني فكرت بالمشكلة قبل ان ادرس ال cursors وبالتالي لم اكن اعرف حلها بالكيرسور..لكنًي ما زلت مصمم ان اجد من يحلها بدون cursor او for cursor .. تم تعديل 18 يناير 2005 بواسطة undo اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
undo بتاريخ: 17 فبراير 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 17 فبراير 2005 للرفع للمرة الأخيرة و سأضع الحل خلال يومين..بالمناسبة.. احد اصدقائي استطاع حل اللغز :angry: اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mamado بتاريخ: 17 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 17 فبراير 2005 create or replace procedure print_all_empisv_count number :=0;v_id s_emp.id%type;v_last_name s_emp.last_name%type;beginselect count(*) into v_count from s_emp;for i in 1..v_count loopselect id, last_name into v_id, v_last_namefrom s_empwhere id = i;dbms_output.put_line(v_id ||' '||v_last_name);end loop;end;/ Al salam Alikomi think that the first example that OSAMA mentioned is true with the following changeswhere rownum=i;because rownum psuedocolumn add a sequence number to the result set of data اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
alhomam بتاريخ: 17 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 17 فبراير 2005 يا اخوان ال cursor وضعت حتى تحل المشكلةوعدم استخدامها يضرنا الا استخدام الكثير من الكود وهاد هو الفرق بين profissional والعادي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
louy-s بتاريخ: 17 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 17 فبراير 2005 declare v_empno emp.empno%type;v_ename emp.ename%type;v_min_empno emp.empno%type;v_max_empno emp.empno%type;begin select min(empno),max(empno)into v_min_empno,v_max_empnofrom emp;for i in v_min_empno..v_max_empno loopbeginselect empno,enameinto v_empno,v_enamefrom empwhere empno=i;dbms_output.put_line(v_empno||' '||v_ename);exception when no_data_found then null;end;end loop;end; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
louy-s بتاريخ: 18 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 18 فبراير 2005 (معدل) Al salam Alikomi think that the first example that OSAMA mentioned is true with the following changeswhere rownum=i;because rownum psuedocolumn add a sequence number to the result set of data u can't use rownum=itry thisselect * from empwhere rownum=5use rownum with <or <= andtry thisselect * from emp where rownum<=4 تم تعديل 18 فبراير 2005 بواسطة louy-s اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abu_kalid بتاريخ: 23 نوفمبر 2011 تقديم بلاغ مشاركة بتاريخ: 23 نوفمبر 2011 والله اخى undo الحلول التالية تعتمد فعلا على الـ Cursor وقصدت بالمشاركة بها توضيح فوائد الـ Cursor وانصح كل الاخوة الاعضاء الذين لا يستخدمون الـ Cursor عليهم بالبحث فى موضوعه يا اخوه المشاركون فعلا ماقاله الاخ اسامه سليمان . لابد من استخدام cursor اليوم او غدا لااهميته . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.