mostfa_future بتاريخ: 10 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 10 ديسمبر 2009 DECLARE TYPE dept_table_type IS TABLE OF departments.department_name%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; loop_count NUMBER; deptno NUMBER; BEGIN FOR i IN 1..100 LOOP if MOD(i,10)=0 then SELECT department_name INTO my_dept_table (i) FROM departments WHERE DEPARTMENT_ID = i ; end if; END LOOP; FOR i IN my_dept_table.FIRST..my_dept_table.LAST LOOP DBMS_OUTPUT.PUT_LINE(my_dept_table(i).department_name) ; END LOOP; END; DBMS_OUTPUT.PUT_LINE(my_dept_table(i).department_name) ; * ERROR at line 18: ORA-06550: line 18, column 44: PLS-00487: Invalid reference to variable 'DEPARTMENTS.DEPARTMENT_NAME%TYPE' ORA-06550: line 18, column 6: PL/SQL: Statement ignored المشكله فى امر الطباعه لو حذفت امر الطباعه الكود بيشتغلوجزاكم الله خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sara gamal بتاريخ: 10 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 10 ديسمبر 2009 (معدل) المشكله في department_name الفي جمله الطباعه شيله ملوش لازمه لان ال Table الانت عامله مفهوش غير ال department_nameفمش محتاج تكتبه انا جربت الكود ده بس غيرت الارقام خليتها ارقام صغيره واشتغل من غير جمله ال if صحوبجمله if اشتغل لأول قيمه بس لما بيجى قيمه مش موجوده في الشرط بيوقف وبيخرج no data found متهيالى ان بتحصل مشكله لما تسيب قيم في النص من غير ما يدخل فيها قيمهشوف الصور وهتفهم قصدى وده الكود لو عايز تجربه SET SERVEROUTPUT ON DECLARE TYPE dept_table_type IS TABLE OF departments.department_name%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; BEGIN FOR i IN 1..6 LOOP if MOD(i,2)=0 then SELECT department_name INTO my_dept_table(i) FROM departments WHERE DEPARTMENT_ID=i ; end if; END LOOP; FOR i IN my_dept_table.FIRST..my_dept_table.LAST LOOP DBMS_OUTPUT.PUT_LINE(my_dept_table(i)); END LOOP; END; My_Pictures.rar تم تعديل 10 ديسمبر 2009 بواسطة sara gamal اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 10 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 ديسمبر 2009 المشكله في department_name الفي جمله الطباعه شيله ملوش لازمه لان ال Table الانت عامله مفهوش غير ال department_nameفمش محتاج تكتبه انا جربت الكود ده بس غيرت الارقام خليتها ارقام صغيره واشتغل من غير جمله ال if صحوبجمله if اشتغل لأول قيمه بس لما بيجى قيمه مش موجوده في الشرط بيوقف وبيخرج no data found متهيالى ان بتحصل مشكله لما تسيب قيم في النص من غير ما يدخل فيها قيمهشوف الصور وهتفهم قصدى وده الكود لو عايز تجربهSET SERVEROUTPUT ON DECLARE TYPE dept_table_type IS TABLE OF departments.department_name%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; BEGIN FOR i IN 1..6 LOOP if MOD(i,2)=0 then SELECT department_name INTO my_dept_table(i) FROM departments WHERE DEPARTMENT_ID=i ; end if; END LOOP; FOR i IN my_dept_table.FIRST..my_dept_table.LAST LOOP DBMS_OUTPUT.PUT_LINE(my_dept_table(i)); END LOOP; END; [/quoteالسلام عليكم ورحمه الله وبركته اختى العزبز الغلاط بيطلع بسب تغيرك فى قيم ifخدى بالك كدهOR i IN 1..100 LOOP if MOD(i,10)=0 then SELECT department_name INTO my_dept_table (i) FROM departments WHERE DEPARTMENT_ID = i ;انا كده بقوله لو باقى قسمه i على 10نفذلان لو معملتش كده قيمهi lمحطوط WHERE DEPARTMENT_ID=i ;و الاقسام ماشبه كده 10 و20 و30و40 الخفبطريقه دى انا بضمن انى امشى بنفس القيم يعنى كده مفروض يطلع 10 قيم لانو هيختر او ل القيمه متلا عندما بيكون 1 مش هينفع يلف لاغايط اما يوصل على لغايط 10 ساعتها مفيش باقى قسمه هيحط 10 فى WHEREو يجب اول قسم وهكذا انا الكود عندى شغال لغايك اللوب التانى DECLARE TYPE dept_table_type IS TABLE OF departments.department_name%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; loop_count NUMBER; deptno NUMBER; BEGIN FOR i IN 1..100 LOOP if MOD(i,10)=0 then SELECT department_name INTO my_dept_table (i) FROM departments WHERE DEPARTMENT_ID = i ; end if; END LOOP; end; لو جربتى كده هيشتغل ويحط البيانات فى الجدول انا عايز لوب تانى على هذا الكود يطبع البيانات على الشاشهوشكرا على اهتمامك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sara gamal بتاريخ: 11 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 11 ديسمبر 2009 حضرتك مفهمتش قصدى انا فاهمه ايه التقصده من جمله ال If بتاعتك وانا غيرتها لان معنديش المستخدم الانت شغال عليه وارقام department_id عندى 1و2و3 ..............لغايه 6مش زي العندك لما جربت الكود ده SET SERVEROUTPUT ON DECLARE TYPE dept_table_type IS TABLE OF departments.department_name%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; BEGIN FOR i IN 1..6 LOOP SELECT department_name INTO my_dept_table(i) FROM departments WHERE DEPARTMENT_ID=i ; END LOOP; FOR i IN my_dept_table.FIRST..my_dept_table.LAST LOOP DBMS_OUTPUT.PUT_LINE(my_dept_table(i)); END LOOP; END; اشتغل وطبع القيم صح جدا وده لان جمله ال for عند كل i كان في قيمه تدخلها وعشان كده متهيألى بيطبع صحنيجي بقى لو عايزين نضع شرط مشابهه لفكرتك في جمله ال if وده الكود الفي المشاركه السابقه كده عند اول loop الشرط مش هيتحقق يبقى لسه مفيش حاجه دخلت تانى loop متحققه يبقى في قيمه دخلت تالت Loop مش متحققه يبقى كده في قيمه فارغه في ال table الجديد الانشأناه ومتهيألى من هنا خلاص المشكله ابتدت عشان كده بيطبع اول قيمه فقط ومن بعد القيم الفارغه بيطلع رساله no data found وهى هى فكره جمله ال if بتاعتك بس انا عملتها كده عشان تتناسب مع البيانات العندى ده وجهه نظري ومش شرط يكون صح ولو في حد يحب يوضح اي حاجه ياريت عشان كلنا نعرف اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 12 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 12 ديسمبر 2009 السلام عليكم ورحمة الله - عند اعداد الloop الثانية للطباعة سيكون معك اول قيمة هى 10 مثلا وستكون اعلى قيمة = 40 مثلا فعندما تنفذ ال loop ستكون بين 10 و 40 وبالتالى الloop ستنفذ بارقام 1 - 2-3-4-5-6-7-8-9-10 ,وهكذا وانت سبق تخزين الindex بقيم 10 - 20 -30- 40 لذلك يجب عمل الLoop الثانية بااستخدام الدالة mod(i,10) so وهى نفس الطريقة التى ملئت بها الIndex - يجب استخدام ال exception حتى يتم معرفة وقت انتهاء البيانات والخرج من ال loop مع شرط when no_data_foundاليك المثال محلول مع المخرجات ( على جدول الادارات مع مستخدم scott DECLARE TYPE dept_table_type IS TABLE OF dept.dname%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; loop_count NUMBER; deptno NUMBER; BEGIN FOR i IN 1..100 LOOP if mod(i,10) = 0 then SELECT dname INTO my_dept_table (i) FROM dept WHERE DEPtno = i ; end if; END LOOP; exception when no_data_found then DBMS_OUTPUT.PUT_LINE('end of data') ; FOR i IN my_dept_table.FIRST..my_dept_table.LAST LOOP if Mod(i,10) = 0 then DBMS_OUTPUT.PUT_LINE('department name = '||my_dept_table(i)) ; end if; END LOOP; END; SQL> / end of data department name = ACCOUNTING department name = RESEARCH department name = SALES department name = OPERATIONS PL/SQL procedure successfully completed. مرفق ملف عن Working with Composite data types Working_with_Composite_datatypes.pdf اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 12 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 12 ديسمبر 2009 شكرا يا خى على اهتمامك الكود اشتغل فعلا ولكن يوجد سوال if Mod(i,10) عملت جمله الشرط دى عشان اتحكم فى دخول البيانات فى الانديكس ولكن اثنا خروجه اما بتحكم بالجمله دىFOR i IN my_dept_table.FIRST..my_dept_table.LASTمن المنطقى كده تشتغل بدوان اضافاتجمله if عشات انا بقوله من اول قيمه الى اخر قيمه ارجو التوضيح وجزاك الله خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 12 ديسمبر 2009 تقديم بلاغ مشاركة بتاريخ: 12 ديسمبر 2009 السلام عليكم ورحمة الله عند اعداد الloop الثانية للطباعة سيكون معك اول قيمة هى 10 مثلاوستكون اعلى قيمة = 40 مثلافعندما تنفذ ال loop ستكون بين 10 و 40وبالتالى الloop ستنفذ بارقام 1 - 2-3-4-5-6-7-8-9-10 ,وهكذاوانت سبق تخزين الindex بقيم 10 - 20 -30- 40لذلك يجب عمل الLoop الثانية بااستخدام الدالة mod(i,10) soوهى نفس الطريقة التى ملئت بها الIndex اى ان القيم التى ستكون فى الاندكس i ستكون 10 -20-30- 40 وعند تنفيذ الloop سيتعامل مع الارقام من 10 الى 40 اي قيم i فى الLoop ستكون 10-11-12-13-14 -................والقيم 11-12-13 - غير موجودة فى الاندكس وهذا يسبب خطأ فى استرجاع البيانات اليك طريقه اخى لتخزين الاندكس = 1 -2-3-4 DECLARE TYPE dept_table_type IS TABLE OF dept.dname%TYPE INDEX BY PLS_INTEGER; my_dept_table dept_table_type ; loop_count NUMBER; deptno NUMBER; BEGIN FOR i IN 1..100 LOOP if mod(i,10) = 0 then SELECT dname INTO my_dept_table (i/10) FROM dept WHERE DEPtno = i ; end if; END LOOP; exception when no_data_found then DBMS_OUTPUT.PUT_LINE('end of data') ; FOR i IN my_dept_table.FIRST..my_dept_table.LAST LOOP DBMS_OUTPUT.PUT_LINE('index= '||to_char(i)||' department name = '||my_dept_table(i)) ; END LOOP; END; / SQL> / end of data index= 1 department name = ACCOUNTING index= 2 department name = RESEARCH index= 3 department name = SALES index= 4 department name = OPERATIONS PL/SQL procedure successfully completed. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 13 ديسمبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 ديسمبر 2009 جزاك الله خير يااخى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.