2016-09-17 86 views
0

我想創建PL/SQL函數接收表名和列名和條件,然後從表中返回其名稱在參數中傳遞的一個值。PL SQL動態SQL

我所創建的函數是這樣的:

create or replace function get_dynamic 
    (tbl_name nvarchar2,col_name nvarchar2 ,cond nvarchar2) 
return nvarchar2 is 
    res nvarchar2(30); 
    code varchar2(500):='begin select :col_name into :res from :tbl_name where :cond; end;'; 
begin 
    EXECUTE IMMEDIATE code using in col_name , out res , in tbl_name, in cond; 
    return res; 
end; 

,當我使用此代碼調用該函數沒有任何問題創建的函數:

begin 
    DBMS_OUTPUT.PUT_LINE(get_dynamic('EMPLOYEES', 'FIRST_NAME', 'EMPLOYEE_ID=100')); 
end; 

我得到了自己的錯誤:

ERROR at line 1: 
ORA-06550: line 1, column 51: 
PL/SQL: ORA-00903: invalid table name ORA-06550: line 1, column 7: 
PL/SQL: SQL Statement ignored ORA-06512: at "HR.GET_DYNAMIC", line 7 ORA-06512: at line 2 

雖然表名,列na我和條件都是正確的。

幫助請!..

回答

4

不能使用綁定變量來構造SQL語句。你只能用它來傳遞數據。用這種方法重寫你的程序:

create or replace function get_dynamic 
    (tbl_name nvarchar2,col_name nvarchar2 ,cond nvarchar2) 
return nvarchar2 is 
    res nvarchar2(30); 
    code varchar2(500):='begin select '||col_name||' into :res from '||tbl_name||' where '||cond||'; end;'; 
begin 
    EXECUTE IMMEDIATE code using out res; 
    return res; 
end;