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

إرسال باراميتر لإحدي الأغراض


MMA

Recommended Posts

بسم الله الرحمن الرحيم



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

الأخوة الأعزاء ، تحية طيبة وبعد ،

واجهتني مشكلة غريبة ، علي الأقل في نظري ،

بنيت جملة 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





فما هو سبب هذه المشكلة



ملحوظة أخيرة ، تحدث هذه المشكلة أثناء إنشاء غرض يرتجع جدول ، ولكن عند إنشاء غرض يرتجع قيمة واحدة لا تحدث هذه المشكلة


شكراً

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

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


الغريبة نحجت كل هذه الأكواد عندي تماماً
وبالشكل التالي ما علي إلا أن نسخت وقمت باللصق


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.0
PL/SQL 9.2.0.1.0
TNS for 32-bit Windows: 9.2.0.1.0

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

السلام عليكم ورحمة الله
Oracle Products Release
إصدارة قاعدة البيانات
إصدارة الـ PL/SQL
إصدارة الـ Listener

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

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

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

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

×   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.

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

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

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