MMA بتاريخ: 22 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 22 يوليو 2008 بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاتة ،الأخوة الأعزاء ، تحية طيبة وبعد ،واجهتني مشكلة غريبة ، علي الأقل في نظري ،بنيت جملة Function ترتجع Table معين ، هذا الـ Function يطلب مني دائماً أن أدخل الـ Parameters الخاصة به ثابتة وليست متغير ولا أعلم ما السبب !!!مثال :أنا لدي الغرض التالي : CREATE OR REPLACE TYPE O_EMP IS OBJECT(EMPNO NUMBER(4), ENAME VARCHAR2(10)); / CREATE OR REPLACE TYPE T_EMP IS TABLE OF O_EMP; / CREATE OR REPLACE FUNCTION GET_EMP(IN_START NUMBER, IN_END NUMBER) RETURN T_EMP AS CURSOR CUR IS SELECT EMPNO, ENAME FROM EMP WHERE EMPNO BETWEEN IN_START AND IN_END; ID_NO NUMBER; ID_NAME VARCHAR2(20); P_RETURN T_EMP := T_EMP(); BEGIN OPEN CUR; FETCH CUR INTO ID_NO, ID_NAME; WHILE CUR%FOUND LOOP P_RETURN.EXTEND; P_RETURN(P_RETURN.COUNT) := O_EMP(ID_NO, ID_NAME); FETCH CUR INTO ID_NO, ID_NAME; END LOOP; CLOSE CUR; RETURN P_RETURN; END; / حينما أستدعية بهذه الطريقة : DECLARE ID_NAME VARCHAR2(20); CURSOR C IS SELECT ENAME FROM TABLE(GET_EMP(5, 10)); BEGIN OPEN C; FETCH C INTO ID_NAME; CLOSE C; END; / يعمل معي بنجاحولكن لاحظوا أنني أستدعيت الـ Function بإدخال قيم الباراميترات من 5 الي 10 بحيث أن يكون ثابتاً . ولكن عندما فكرت بأن أجعلها متغيرة من الطبيعي أن أفكر في الشكل التالي : DECLARE ID_NAME VARCHAR2(20); ID_START NUMBER := 5; ID_END NUMBER := 10; CURSOR C IS SELECT ENAME FROM TABLE(GET_EMP(ID_START, ID_END)); BEGIN OPEN C; FETCH C INTO ID_NAME; CLOSE C; END; / ولكن للأسم دائماً تعرض لي الرسالة التالية : ORA-22905: لا يمكن الوصول إلى صفوف من بند جدول غير متداخل ORA-06512: عند line 5 ORA-06512: عند line 7 فما هو سبب هذه المشكلةملحوظة أخيرة ، تحدث هذه المشكلة أثناء إنشاء غرض يرتجع جدول ، ولكن عند إنشاء غرض يرتجع قيمة واحدة لا تحدث هذه المشكلةشكراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Shibeika بتاريخ: 22 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 22 يوليو 2008 السلام عليكم ورحمة الله وبركاته الغريبة نحجت كل هذه الأكواد عندي تماماًوبالشكل التالي ما علي إلا أن نسخت وقمت باللصق 1 DECLARE 2 ID_NAME VARCHAR2(20); 3 ID_START NUMBER := 7369; 4 ID_END NUMBER := 7934; 5 CURSOR C IS SELECT ENAME FROM TABLE(GET_EMP(ID_START, ID_END)); 6 BEGIN 7 OPEN C; 8 FETCH C INTO ID_NAME; 9 CLOSE C; 10* END;SQL> /PL/SQL procedure successfully completed. لكنني سأريك بعض الملاحظات بالنسبة للبئية التي أعمل بهاNLSRTL 9.2.0.1.0 Oracle9i Enterprise Edition 9.2.0.1.0PL/SQL 9.2.0.1.0 TNS for 32-bit Windows: 9.2.0.1.0 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MMA بتاريخ: 22 يوليو 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 22 يوليو 2008 NLSRTL 9.0.1.0.0 Oracle9i Enterprise Edition 9.0.1.0.0 PL/SQL 9.0.1.0.0 TNS for 32-bit Windows: 9.0.1.0.0 !!!!!!!!! اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Shibeika بتاريخ: 22 يوليو 2008 تقديم بلاغ مشاركة بتاريخ: 22 يوليو 2008 (معدل) السلام عليكم ورحمة اللهOracle Products Releaseإصدارة قاعدة البياناتإصدارة الـ PL/SQLإصدارة الـ Listener تم تعديل 22 يوليو 2008 بواسطة Shibeika اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.