PL SQL动态SQL

时间:2016-09-17 14:55:42

标签: sql oracle plsql

我想创建PL / 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;

使用此代码调用函数时,创建的函数没有任何问题 BUT

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

虽然表名,列名和条件都是正确的。

请帮助!..

1 个答案:

答案 0 :(得分: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;