首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL动态SQL

SQL动态SQL
EN

Stack Overflow用户
提问于 2016-09-17 14:55:41
回答 1查看 84关注 0票数 0

我想要创建PL/SQL函数,接收表名和列名以及条件,然后从表中返回一个值,他的名字在参数中被传递。

我创建了这样的函数:

代码语言:javascript
运行
复制
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;

当我使用以下代码调用函数时,创建的函数没有任何问题:

代码语言:javascript
运行
复制
begin
    DBMS_OUTPUT.PUT_LINE(get_dynamic('EMPLOYEES', 'FIRST_NAME', 'EMPLOYEE_ID=100'));
end;

我明白他的错误:

代码语言:javascript
运行
复制
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

尽管表名、列名和条件都是正确的。

救命!..

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-17 16:52:21

不能使用绑定变量构造SQL语句。您只能将其用于传递数据。用这样的方式重写您的过程:

代码语言:javascript
运行
复制
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;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39548191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档