الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:

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.

بتاريخ:
  • كاتب الموضوع

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

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.