2009-05-21 55 views
2

我有像签名一堆功能:如何使用EXECUTE IMMEDIATE获取记录?

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

这一切工作正常,我(甲骨文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

我想你可以连接到查询,就像你用func_name所做的那样。

+0

那你的意思是:拼接价值动态SQL字符串的变量,而不是使用'USING'子句? – engro 2009-05-21 09:08:57

+0

是的。我承认这是一个安全漏洞,只是在par1和par2不是“安全”字符串的情况下。 – ATorras 2009-05-21 11:19:06

相关问题