如何在记录中插入存储在ALL_SOURCE.TEXT中的程序文本?
这部分代码给了我错误:"缺少逗号"
execute immediate '
insert into results(SrcProcedure) values(' ''
|| tabela_temporare(1).text ||
'' ')';
我认为这是由于存储过程文本中包含未转义的字符,但我无法找到修复它的方法。
答案 0 :(得分:0)
如果要在Varchar中包含字符串分隔符(撇号:'),则必须使用两个连续的撇号,然后使用另一个撇号来结束字符串。它会给你一个错误,因为你首先结束了字符串。 试试这段代码:
EXECUTE IMMEDIATE 'INSERT INTO results(SrcProcedure) values(''' || tabela_temporare(1).text || ''')';
编辑: 更好地使用Bind Variables,请参阅我的示例代码:
CREATE TABLE RESULTS (SRCPROCEDURE VARCHAR2 (300));
DECLARE
v_SQL VARCHAR2(4000) := 'INSERT INTO results(SrcProcedure) VALUES(:1)';
BEGIN
EXECUTE IMMEDIATE v_SQL USING 'something2';
END;
我希望它现在有效! :)
答案 1 :(得分:0)
如何在PL / SQL中执行此操作:
INSERT INTO results(SrcProcedure) VALUES (tabela_temporare(1).text);
在内部,它将使用绑定变量将PL / SQL变量传递给INSERT。
请注意,强烈建议远离动态SQL(EXECUTE IMMEDIATE
等),因为该代码很容易SQL injection。
[UPDATE]
我不知道还能说些什么。但是请考虑使用字符串搜索和替换:{/ p>在FOR
循环内使用动态构建的SQL
动态SQL有很好的用途,但这不是其中之一,而且它也反对所有可能的建议来连接'参数vs'绑定'它们。
答案 2 :(得分:-1)
如果该文本字段包含实际存储的pl / sql代码,则唯一可能导致问题的字符是单引号。
因此,用两个单引号替换每个实例,然后将其解析为正确转义的单引号。当然,你必须在replace语句中转义引号才能使它工作,但试试这个:
execute immediate '
insert into results(SrcProcedure) values(' ''
|| replace(tabela_temporare(1).text,'''','''''') ||
'' ')';