首页 > 解决方案 > 立即执行 sql 连接的插入字符串

问题描述

如果我对此立即执行,我没有问题:

execute immediate 'insert into tab_aantal2 (table_name,count_1,value_1) select table_name,count_1,value_1 from(select ''CUSTOMERS'' table_name,count(1) count_1,CUSTOMERID||''~''||NAME||''~''||ADDRESS
value_1  from PJO.CUSTOMERS group by CUSTOMERID||''~''||NAME||''~''||ADDRESS having count(1) > 1)';

该字符串存储在一个表中,如下所示:

'insert into tab_aantal2 (table_name,count_1,value_1) 
select table_name,count_1,value_1 from(select ''CUSTOMERS'' table_name,count(1) count_1,CUSTOMERID||''~''||NAME||''~''||ADDRESS  value_1 
from PJO.CUSTOMERS 
group by CUSTOMERID||''~''||NAME||''~''||ADDRESS  
having count(1) > 1)'

如果我将字符串放在一个变量中,DBMS_OUTPUT.PUT_LINE 会返回这个确切的字符串,但是当我尝试执行该变量时,我会得到“无效的 SQL 语句”,所以我认为它一定是带引号的东西,但我就是想不通。我最终将尝试遍历数百个表(在不同的表上运行上述)

任何帮助高度赞赏。

标签: sqloracleplsqlexecute

解决方案


实际传递给的字符串EXECUTE IMMEDIATE不应该将撇号加倍——只有在 PL/SQL 编译器解析字符串时才需要。将数据库中的数据更改为:

插入 tab_aantal2 (table_name,count_1,value_1) select table_name,count_1,value_1 from(select 'CUSTOMERS' table_name,count(1) count_1,CUSTOMERID||'~'||NAME||'~'||ADDRESS value_1 from PJO .CUSTOMERS group by CUSTOMERID||'~'||NAME||'~'||ADDRESS count(1) > 1)

或者换句话说,将所有双撇号改为单撇号。


推荐阅读