بتاريخ: 11 يناير 200521 سنة comment_23968 السلام عليكمحالياً اقوم بدراسة الاوراكل و بدأت مؤخراً في الPL/SQL و ووجدت انه على عكس الSql لا يمكنك استخدام الselect للحصول على اكثر من row واحد فحسب,, لو عايز اكثر من row فعليك استخدام الcursorاللغز كيف يمكنك من procedure و عن طريق السيكول و بدون الcursors عرض جميع الصفوف في جدول؟؟مثال: عرض اسماء الموظفين في جدول scott.empتم تغيير عنوان الموضوع ليدل على محتواه , راجع شروط الكتابه في المتنديإداره المنتدي تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_23982 <span style='font-family:Traditional Arabic'></span> بسم الله الرحمن الرحيم حقيقة أخ UNDO وحسب معلوماتي المتواضعه فأنة يمكنك الحصول على اكثر من ROW باستخدام Select في داخل الفورمولكن المشكلة تكمن في انه كيف يمكننا أخبار الديفيلوبر ان يأخذ كل Row ثم يضعه في سجل على الشاشة تابع ل بلوك ما. ثم يأتي بال Row الثاني ويضعه في السجل الثاني في نفس البلوك ... وهكذالحل هذه المشكلة فاننا نحتاج هنا لاستخدام cursor حيث سيقوم هذاcursor بارجاع one Row في كل مرة وحتى نضع Row ألثاني في السجل الثاني في البلوكفاننا نستخدم الأمر Next_Record في هذا البلوكأعتقد أصبحت النقطة واضحه الأن تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24023 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 يناير 200521 سنة بواسطة Osama Soliman تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24045 السلام عليكم ،،الأخ / اسامه شكرا على المثال .. واسترجاع بيانات الجدول يعتمد على رقم الموظف وبافتراض ان ارقام الموظفين فى تسلسل مستمر اى ( 1-2-3-4-5 ) ولكن فى حالة عدم وجود موظف رقم 3 مثلا .. فلن ترجع بيانات للمسلسل رقم 3 .. اعتقد انه لن يمكن تنفيذ هذا الامر مع جدول emp فى scott لان ارقام الموظفين غير مسلسله ..اي بمعنى اخر .. اذا كان البحث من جدول ليس به ارقام مسلسله مثل رقم الموظف .. فما هو الحل ؟؟شكرا لك مقدما تم تعديل 12 يناير 200521 سنة بواسطة Amgad تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24048 عن طريق الـ 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;/ أدرى بأن هناك فجرا .. وأن بعد العسر يسرالكنهم ساموا الفتى وبلاده عسفا وقهراوالعالم الحيران يشهد ما يحل بأمتىوأنا هنا .. فى غربتى .. فى لوعتىأبكى وأمسح فى ذهول دمعتىوأظل أنظر للسماء .. والقلب يخفق بالدعاءيارب .. أوقظ أمتى تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة كاتب الموضوع comment_24052 فأنة يمكنك الحصول على اكثر من ROW باستخدام Select في داخل الفورمولكن المشكلة تكمن في انه كيف يمكننا أخبار الديفيلوبر ان يأخذ كل Row ثم يضعه في سجل على الشاشة تابع ل بلوك ما.ثم يأتي بال Row الثاني ويضعه في السجل الثاني في نفس البلوك ... وهكذالحل هذه المشكلة فاننا نحتاج هنا لاستخدام cursor حيث سيقوم هذاcursor بارجاع one Row في كل مرةوحتى نضع Row ألثاني في السجل الثاني في البلوك و الله انا ذو المعلومات المتواضعة انا لا ادري شيئاً عن الاوراكل فورمز و لكني تكلمت من خلال علمي البسيط في الpl/SQL .. المطلوب هو STORED PROCEDUREاخي اسامة::كلام امجاد سليم للغاية.. انا ابحث عن كود ينفع مع اي جدول و بدون الاعتماد حتى على أي حقل في الجدول..أخي الشواف: :D برضه استخدمت CURSOR رغم انه IMPLICIT .. تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24086 اخى امجد فعلاً كلام صحيح مائة بمائة والمفروض فى هذه الاحوال استخدام 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 ; تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24088 مثال اخر :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; تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24089 واقرا هذه الطريقة فهى مهمة جدا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. تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة comment_24092 واخيراً اليك هذا المثال :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 يناير 200521 سنة بواسطة Osama Soliman تقديم بلاغ
بتاريخ: 12 يناير 200521 سنة كاتب الموضوع comment_24103 السلام عليكمالحلول صحيحة لكن كلها باستخدام الCURSORS .. انا لا اريد استخدام اي CURSOR ..لكن اقرب الحلول لما اقصده هو حلك الأول يا اسامة و ليس حلولك التالية.. ففي الحل الأول استخدمت SELECT فقط في حلقة تكرارية و لكن لم تستطع التغلب على مشكلة الوصول للصفوف بصورة متتالية بدون الاعتماد على الجدول نفسه.. تقديم بلاغ
بتاريخ: 16 يناير 200521 سنة comment_24322 والله اخى undo الحلول التالية تعتمد فعلا على الـ Cursor وقصدت بالمشاركة بها توضيح فوائد الـ Cursor وانصح كل الاخوة الاعضاء الذين لا يستخدمون الـ Cursor عليهم بالبحث فى موضوعه تقديم بلاغ
بتاريخ: 16 يناير 200521 سنة كاتب الموضوع comment_24329 للرفع..اللغز ليس اختبار للمعلومات و لكن للتفكير و أعتقد ان المشكلة هنا انكم تحاولون استخدام معلوماتكم هنا..انا عارف ان اللغز مستفز و لكن هذه هي أضمن طريقة لكي أجد من يحله تقديم بلاغ
بتاريخ: 17 يناير 200521 سنة comment_24406 السلام عليكم ورحمة الله وبركاتهأخى العزيزبداية يستحيل بكل الطرق الممكنة عمل ما تريد بدون استخدام الcursorبل لا يمكن عمل استعلام أو ما شابه فى الأوراكل بدون استخدام الcursorوذلك لأن لتنفيذ الاستعلام يقوم الاوراكل بفتح implicit cursor حتى لو كان استعلام بسيط عباره عن جملة select فقطلذا فإن عمل cursor forloop هو الأقرب لما تريد .أما فكرتك نفسها فقد فكرت فيها فى بداية تعلمى للغة الpl/sql وفكرت فى انى لا استخدم الexplicit cursor ولكن استخدم correlated subquery حتى استطيع أن أمر على قيمه قيمه من الجدول مع العلم أن هذا سيتطلب من أوراكل فتح implicit cursorولكن لأبقى معك فى كلامك ونكتفى بجمل الselect بغض النظر عن الimplicit cursor ولكن أنا لم أخرج من حيز التفكير الى حيز التنفيذمجرد فكره ربما يكون لديك الوقت لتجربتها .شكرا لهذا اللغز .والى الغاز اخرى والسلام خير ختامأدرى بأن هناك فجرا .. وأن بعد العسر يسرالكنهم ساموا الفتى وبلاده عسفا وقهراوالعالم الحيران يشهد ما يحل بأمتىوأنا هنا .. فى غربتى .. فى لوعتىأبكى وأمسح فى ذهول دمعتىوأظل أنظر للسماء .. والقلب يخفق بالدعاءيارب .. أوقظ أمتى تقديم بلاغ
بتاريخ: 18 يناير 200521 سنة كاتب الموضوع comment_24503 وذلك لأن لتنفيذ الاستعلام يقوم الاوراكل بفتح implicit cursor حتى لو كان استعلام بسيط عباره عن جملة select فقطلذا فإن عمل cursor forloop هو الأقرب لما تريد . و الله كلامك سليم 100% و فعلاً انتبهت لهذه النقطة ...و ايضا تنبؤك سليم لأني فكرت بالمشكلة قبل ان ادرس ال cursors وبالتالي لم اكن اعرف حلها بالكيرسور..لكنًي ما زلت مصمم ان اجد من يحلها بدون cursor او for cursor .. تم تعديل 18 يناير 200521 سنة بواسطة undo تقديم بلاغ
بتاريخ: 17 فبراير 200521 سنة كاتب الموضوع comment_27667 للرفع للمرة الأخيرة و سأضع الحل خلال يومين..بالمناسبة.. احد اصدقائي استطاع حل اللغز :angry: تقديم بلاغ
بتاريخ: 17 فبراير 200521 سنة comment_27671 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 تقديم بلاغ
بتاريخ: 17 فبراير 200521 سنة comment_27720 يا اخوان ال cursor وضعت حتى تحل المشكلةوعدم استخدامها يضرنا الا استخدام الكثير من الكود وهاد هو الفرق بين profissional والعادي تقديم بلاغ
بتاريخ: 17 فبراير 200521 سنة comment_27732 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; تقديم بلاغ
بتاريخ: 18 فبراير 200521 سنة comment_27773 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 فبراير 200521 سنة بواسطة louy-s تقديم بلاغ
بتاريخ: 23 نوفمبر 201114 سنة comment_217878 والله اخى undo الحلول التالية تعتمد فعلا على الـ Cursor وقصدت بالمشاركة بها توضيح فوائد الـ Cursor وانصح كل الاخوة الاعضاء الذين لا يستخدمون الـ Cursor عليهم بالبحث فى موضوعه يا اخوه المشاركون فعلا ماقاله الاخ اسامه سليمان . لابد من استخدام cursor اليوم او غدا لااهميته . تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.