إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

مساعدة : فى طباعة بيانات مخزنه فى Index BY Table


7 رد (ردود) على هذا الموضوع

#1 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 December 2009 - 06:11 AM

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



المشكله فى امر الطباعه لو حذفت امر الطباعه الكود بيشتغل
وجزاكم الله خير

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#2 sara gamal

sara gamal

    عضو نشط

  • الأعضــاء
  • 411 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 December 2009 - 06:27 PM

المشكله في 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   156.63كيلو   27 عدد مرات التحميل

تم التعديل بواسطة sara gamal, 10 December 2009 - 06:45 PM.


#3 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 11 December 2009 - 02:15 AM

[quote name='sara gamal' date='Dec 10 2009, 07:27 PM' post='178840']
المشكله في 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;

لو جربتى كده هيشتغل ويحط البيانات فى الجدول انا عايز لوب تانى على هذا الكود يطبع البيانات على الشاشه
وشكرا على اهتمامك

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#4 sara gamal

sara gamal

    عضو نشط

  • الأعضــاء
  • 411 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 11 December 2009 - 03:51 AM

حضرتك مفهمتش قصدى انا فاهمه ايه التقصده من جمله ال 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 بتاعتك بس انا عملتها كده عشان تتناسب مع البيانات العندى

ده وجهه نظري ومش شرط يكون صح ولو في حد يحب يوضح اي حاجه ياريت عشان كلنا نعرف

#5 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,559 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 12 December 2009 - 01:37 PM

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

- عند اعداد ال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

ملفات مرفقة


لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#6 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 12 December 2009 - 04:26 PM

شكرا يا خى على اهتمامك الكود اشتغل فعلا ولكن يوجد سوال
if Mod(i,10) عملت جمله الشرط دى عشان اتحكم فى دخول البيانات فى الانديكس
ولكن اثنا خروجه اما بتحكم بالجمله دى
FOR i IN my_dept_table.FIRST..my_dept_table.LAST
من المنطقى كده تشتغل بدوان اضافاتجمله
if عشات انا بقوله من اول قيمه الى اخر قيمه
ارجو التوضيح وجزاك الله خير

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#7 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,559 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 12 December 2009 - 09:52 PM

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

عند اعداد ال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.

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#8 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 13 December 2009 - 04:13 PM

جزاك الله خير يااخى

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة