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

لعباقرة الاوراكل فحسب! فهل تقبل التحدي؟

مغلق
بدأه undo في 12 يناير 2005 · 18 رد · 2,283 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

حالياً اقوم بدراسة الاوراكل و بدأت مؤخراً في الPL/SQL و ووجدت انه على عكس الSql لا يمكنك استخدام الselect للحصول على اكثر من row واحد فحسب,, لو عايز اكثر من row فعليك استخدام الcursor

اللغز (ممنوع المشاركة لمن لايشغّل دماغه :D :D):

كيف يمكنك من procedure و عن طريق السيكول و بدون الcursors عرض جميع الصفوف في جدول؟؟

مثال: عرض اسماء الموظفين في جدول scott.emp

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"
#2

على حسب معلوماتي القديمة ب اوراكل ( لم استخدمها منذ مدة طويلة) الcursor توازي ال RecordSet في VB مثلا مع ADO فهي تعتبر مخزن مؤقت لنتائج جملة SQL فلذلك تقوم انت بطلب النتائج المبنية وتخزينها داخل الcursor وتقوم بعمل ما تشاء بها مثلا في حالتنا هذه في مليء جدول بواسطة Fetch

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#3

صدقني سؤالك مش واضح

#4

كلامك سليم يا محمد .. لكن في الstored procedures يمكنك استخدام الselect بدون cursor لكي تحصل على النتيجة بشرط ان تحتوي على صف واحد فقط..

اقتباس
صدقني سؤالك مش واضح

حسناً سأشرح اللغز بطريقة ثانية::

على سبيل المثال. الكود التالي يقوم بعرض اسم موظف في جدول employees

DECLARE
	V_ENAME VARCHAR2(100);
BEGIN
	SELECT LAST_NAME
	INTO V_ENAME
	FROM EMPLOYEES
	WHERE EMPLOYEE_ID = 101;
	DBMS_OUTPUT.PUT_LINE(V_ENAME);
END;
/

المشكلة ان هذا الكود لن يرجع اكثر من صف واحد فقط و لو ارجع اكثر من صف فسيتسبب في خطأ.. أليس كذلك؟؟

بدون استخدام cursor (او حتى For cursor) و بجملة SELECT مشابهة للتي في الكود, كيف يمكن عرض جميع اسماء الموظفين؟؟

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"
#5

سؤالك حلو يا عم انٌ دو تعالي نفكر سوا الاول

1- الصيغه المكتوبه بترجع بإسم واحد.

2- الاسم ده اخر واحد في الجدول.

3- يعني ال cursor عدا علي كل السجلات وكتب اخر واحد.

4- الكود كالتالي:-

declare

vname emp.enmae%type;

begin

for vname in select ename from emp then

loop

DBMS_OUTPUT.PUT_LINE(vname);

end loop;

end;

#6

سؤالك حلو يا عم انٌ دو تعالي نفكر سوا الاول

1- الصيغه المكتوبه بترجع بإسم واحد.

2- الاسم ده اخر واحد في الجدول.

3- يعني ال cursor عدا علي كل السجلات وكتب اخر واحد.

4- الكود كالتالي:-

declare

vname emp.enmae%type;

begin

for vname in select ename from emp then

loop

DBMS_OUTPUT.PUT_LINE(vname);

end loop;

end;

#7

مفيش فايد حاول تفهمه كده

#8

انا اقترح ان لا نجعل الـ EMPLOYEE_ID تساوي الواحد ، و لكن اقترح ان يتم ادخال جملة الـSelect داخل حلقة Loop و نجعل EMPLOYEE_ID تساوي قيمة متغير يمثل لنا عداد يبدأ من اول موظف و تزداد قيمته داخل الحلقة كل مرة بواحد و حتى اخر موظف ،،

يعني سوف اضيف التالي الى كود الأخ Undo :

- متغير اسمه counter يمثل لي عداد و يبدأ برقم اول موظف ...

- loop يضم جملة Select

- داخل جملة الـ Select نضع counter = EMPLOYEE_ID و في كل مرة نزيد قيمة EMPLOYEE_ID الى ان نصل الى اخر موظف ..

و هذا طبعاً اذا كانت ارقام الموظفين مسلسلة ..!!

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#9
اقتباس
for vname in select ename from emp then

loop

هذا الحل سليم لكنه يستخدم For cursor ايضاً حتى لو كان الcursor غير واضح امامك..

انا عايز بمعلوماتك من السيكول فقط كيف يمكن عرض جميع اسماء الموظفين؟

الحل فيه حلقة تكرارية كما قالت بنت اليمن و لكن ما هي الselectالتي ستستخدمها في الحلقة هذا هو السؤال..

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"
#10

بص يا ان دو انا مش عارف اقولهالك ازاي بس انا هاجيبهالك علي بلاطه

جمله ال select مينفعش ترجع غير بسجل وااااااحد بسسسسسسسسسسس

يعني لازم لها لووووووووب

فاهم

ايين كان شكل او structure بتاع الوووب دي

فيه عندك الكيرسر imlicit and explicit ماشي احنا بنشتغل علي ال explicit

فيه cursor and cursor for loop

انا عملت لك الكيرسر فور لووب

وانتا عملت الكيرسر ثم كفايه عليك كده وبلاش تعقد الامور الاوراكل اسهل بكتير من كده

#11

أنا خبرتي في الأوراكل محدودة لذا سامحوني اذا عملت سينتاكس ايرور

DECLARE
	AMOUNT NUMBER;
	COUNTER NUMBER;
	POINTER NUMBER;
	NAME VARCHAR;
BEGIN
	SELECT COUNT(*) INTO AMOUNT FROM EMPLOYEES;


	POINTER := 0;	

	FOR COUNTER IN 1 .. AMOUNT

LOOP
  SELECT MIN(EMPLOYEE_ID) INTO POINTER 
  FROM EMPLOYEES
  WHERE EMPLOYEE_ID > POINTER;	

  SELECT LAST_NAME INTO NAME
  FROM EMPLOYEES
  WHERE EMPLOYEE_ID = POINTER;
  
  DMBS_OUTPUT.PUT_LINE(NAME);	
	END LOOP
END;

أنا متأكد أن LOOP UNTIL ستكون أفضل بمراحل و لكنني لا أتذكر السينتاكس.

تم تعديل هذه المشاركة بواسطة System Down في 15 يناير 2005 في 22:10

#12

الله عليك يا system up ..... يا خطير!!

الحل 100% و للامانة فحلي كان مختلف شويتين عنك بس المهم انك ظبطتها تمام !!

اقتباس
بص يا ان دو انا مش عارف اقولهالك ازاي بس انا هاجيبهالك علي بلاطه

:D :D :

اقتباس
فاهم

فاهم :( :(

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

حاضر :( :(

بس system up حلهّا من غير cursor

:P :P

و فعلاً الاوراكل اسهل من التعقيد ده بس الموضوع لغز و ليس مشكلة تواجهني .. يعني حبيت اننا نشغّل دماغنا شوية مع بعض بس و الله..

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"
#13

طب يااستاذنا الخطير ممكن اشوف حلك ;)

سبحان الله و الحمد لله لا اله الا الله و الله اكبر

#14

الله ينور عليك اخي System Down ... يعني الفكرة انو اقرأ رقم الموظف اولاً و بعدين اخذه و كل هذا في Loop .. :o :o :o :o

ما شاء الله .. و مشكور اخي Undo على فكرة السؤال اصلاً ... و كثر لنا من هذي الاسئلة ;)

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#15

ماشي يا عم شد دون

ماشي يا عم ان دو

المهم انه مفيش جديد

حكايه اللعب بالمتغيرات كانت ايام الكليه بس خلاص

انتوا كبرتو

الموضوع اكبر من كده

security

priveliges

DBA

more program control

ياريت يكون فيه اسئله في النقاط السابقه

فيها فايده

#16

شكراً شكراً لا داعي! أخجلتم تواضعنا! ;)

على العموم أعتقد أن مثل هذه الألغاز البرمجية مفيدة جداً. صحيح أن الأوراكل و غيره لديها كورسور يحل المشكلة بسهولة، لكن الله أعلم قد تواجه هذه المشكلة بحيث لا يكون استعمال الكورسور شيئاً متاحاً.

مثلاً أنا حليتها لأنني واجهت مشكلة مشابهة قبل فترة في الـ SQL 2000 و ما حبيت أستعمل الكورسور حتى نزيد سرعة أداء النظام.

#17
اقتباس
حكايه اللعب بالمتغيرات كانت ايام الكليه بس خلاص

انتوا كبرتو

:D :D :D :D

المشكلة أني مبتدئ في الاوراكل و معلوماتي في الاوراكل ليست عالية و لكني احب ان أجرب كل شئ عندما اتعلم شئ جديد.. يعني سبب حلي لهذه المسألة اني لم اكن اعرف الcursors عندما قررت ان احل المشكلة..

اقتباس
طب يااستاذنا الخطير ممكن اشوف حلك

DECLARE
	V_COUNT NUMBER;
	V_ROWNUM NUMBER;
	V_ENAME EMPLOYEES.LAST_NAME%TYPE;
BEGIN
SELECT COUNT(*)
	INTO V_COUNT
	FROM EMPLOYEES;
FOR I IN 1..V_COUNT
LOOP
SELECT max(LAST_NAME)
INTO V_ENAME
FROM (SELECT *
FROM EMPLOYEES
ORDER BY last_name)
WHERE ROWNUM<=I;
DBMS_OUTPUT.PUT_LINE(V_ENAME);
END LOOP;
END;
/

اقتباس
و كثر لنا من هذي الاسئلة

لو لقينا حاجة تانية متخفيش.. أكيد سأضع السؤال مخصوص علشان نزعج KHALILFIRST :D :D :D

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"
#18

use the For Loop to get more than one row this is the solution if u want to use the Cursor

#19

أنا نسيت تماماً هذا الموضوع.. في الحقيقة أنا أفاجئ الان عند قراءتي أن الأوراكل لا يمكنه ارجاع أكثر من row في المرة..

فعلاً، أي معلومة بدون تطبيق لا بد أن تنساها و أنا لم استخدم الأوراكل منذ أن تعلمتها الا قليلاً.

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"

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

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