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

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


mostfa_future

Recommended Posts

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




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

رابط هذا التعليق
شارك

المشكله في 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

تم تعديل بواسطة sara gamal
رابط هذا التعليق
شارك


المشكله في 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;


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

رابط هذا التعليق
شارك

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

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

رابط هذا التعليق
شارك

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

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

رابط هذا التعليق
شارك

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

رابط هذا التعليق
شارك

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

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

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية