Как получить запись, используя EXECUTE IMMEDIATE? - PullRequest
2 голосов
/ 21 мая 2009

У меня есть куча функций с подписями вроде:

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 «переменная отсутствует в списке выбора». Как я могу переписать заявление?

Ответы [ 2 ]

2 голосов
/ 21 мая 2009

У меня все отлично работает (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')
0 голосов
/ 21 мая 2009

Я думаю, что вы можете объединить запрос, как вы сделали с func_name .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...