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

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

صورة
- - - - -

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


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

#1 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 22 July 2008 - 09:14 AM

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



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

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

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

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




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



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


شكراً

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#2 Shibeika

Shibeika

    عضو نشط

  • الأعضــاء
  • 240 مشاركة

تاريخ المشاركة 22 July 2008 - 11:07 AM

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

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

#3 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 22 July 2008 - 03:35 PM

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


!!!!!!!!!

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#4 Shibeika

Shibeika

    عضو نشط

  • الأعضــاء
  • 240 مشاركة

تاريخ المشاركة 22 July 2008 - 06:31 PM

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

تم التعديل بواسطة Shibeika, 22 July 2008 - 06:33 PM.