كيفية الحصول على سجل باستخدام تنفيذ فوري؟

StackOverflow https://stackoverflow.com/questions/891919

  •  23-08-2019
  •  | 
  •  

سؤال

لدي مجموعة من الوظائف مع توقيعات مثل:

FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec;  

ولدي وظيفة لاسترداد البيانات من هذه المجموعة من الوظائف:

FUNCTION get_result (func_name IN VARCHAR2, par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec;
IS
    rec1 my_rec;
BEGIN
    EXECUTE IMMEDIATE 'SELECT ' || func_name || '(:par1, :par2) FROM DUAL'
    INTO rec1
    USING IN par1, IN par2;

    RETURN rec1;
END;

ولكن فشل هذا الرمز مع ORA-01007 "متغير ليس في قائمة مختارة".
كيف يمكنني إعادة كتابة العبارة؟

هل كانت مفيدة؟

المحلول

كل شيء يعمل بشكل جيد بالنسبة لي (Oracle 10G)، واحدة قمت بتصحيح خطأ بناء الجملة في تعريف عملتك (شبه القولون غير المرغوب فيه في السطر الأول):

SQL> create type my_rec is object (id integer, name varchar2(30))
  2  /

Type created.

SQL> create FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec
  2  is
  3    l_rec my_rec := my_rec (1, 'x');
  4  begin
  5     return l_rec;
  6  end;
  7  /


Function created.

SQL> CREATE OR REPLACE
  2  FUNCTION get_result (func_name IN VARCHAR2, par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec
  3  IS
  4      rec1 my_rec;
  5  BEGIN
  6      EXECUTE IMMEDIATE 'SELECT ' || func_name || '(:par1, :par2) FROM DUAL'
  7      INTO rec1
  8      USING IN par1, IN par2;
  9      RETURN rec1;
 10  END;
 11  /

Function created.

SQL> select get_result ('func1',1,2) from dual;

GET_RESULT('FUNC1',1,2)(ID, NAME)
-------------------------------------------------
MY_REC(1, 'x')

نصائح أخرى

أعتقد أنه يمكنك التسلسل للاستعلام كما فعلت funct_name..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top