在execute语句中查询引号

时间:2014-08-15 14:33:51

标签: oracle

我有这个正确的查询(我从程序中获取值,我的问题是引号):

EXECUTE IMMEDIATE ('insert into TABLES (table_name)
  values ('||''''||TABLE_NAME||''''||')');

当我尝试添加另一列时,我收到错误,是否可以添加正确的引号?这个是不正确的:

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name)
  values ('||''''||TABLE_NAME||''''||'',''||column_name||''''||')');

2 个答案:

答案 0 :(得分:2)

对于您的陈述:

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name)
  values ('''||TABLE_NAME||''','''||column_name||''')');

但是你应该使用绑定变量,它更容易构造和读取,也更安全:

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name)
  values (:table_name,:column_name)') USING TABLE_NAME, COLUMN_NAME;

正如评论中所指出的,这根本不需要是动态的;或者至少它不会如果你已经调用了与列名不同的变量 - 这仍然有效,但看起来很模糊:

insert into TABLES (table_name,column_name)
values (TABLE_NAME,COLUMN_NAME);

您可以指定范围以使事情变得更加清晰;假设您的程序被称为MY_PROC,您可以这样做:

insert into TABLES (table_name,column_name)
values (MY_PROC.TABLE_NAME,MY_PROC.COLUMN_NAME);

答案 1 :(得分:1)

假设您甚至需要动态SQL - 我不知道您尝试此操作的上下文 - 您的报价问题将按如下方式排序:

EXECUTE IMMEDIATE ('insert into TABLES (table_name) values ('''||TABLE_NAME||''')');

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name) values ('''||TABLE_NAME||''','''||column_name||''')');

但实际上你应该使用绑定变量:

declare v_table_name varchar2(30); 

begin

    -- get your v_table_name here

    EXECUTE IMMEDIATE ('insert into TABLES (table_name) values (:TABLE_NAME)')
    USING v_table_name;

end;