我有这个正确的查询(我从程序中获取值,我的问题是引号):
EXECUTE IMMEDIATE ('insert into TABLES (table_name)
values ('||''''||TABLE_NAME||''''||')');
当我尝试添加另一列时,我收到错误,是否可以添加正确的引号?这个是不正确的:
EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name)
values ('||''''||TABLE_NAME||''''||'',''||column_name||''''||')');
答案 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;