将存储过程的文本插入记录中

时间:2015-04-28 14:21:55

标签: sql oracle stored-procedures plsql

如何在记录中插入存储在ALL_SOURCE.TEXT中的程序文​​本?

这部分代码给了我错误:"缺少逗号"

  execute immediate '
               insert into results(SrcProcedure)  values(' ''
               || tabela_temporare(1).text ||
               '' ')';

我认为这是由于存储过程文本中包含未转义的字符,但我无法找到修复它的方法。

3 个答案:

答案 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

  1. 它会非常慢,因为对于每次循环迭代,您都会重新编译动态SQL。
  2. SQL本身执行速度较慢,因为它无法缓存。
  3. 您有SQL注入的危险,可能导致错误和安全问题。您认为通过搜索修改了它并替换了引号,但我敢打赌可能会出现您未考虑的情况。
  4. 搜索和替换引号的过程本身也非常慢。
  5. 动态SQL有很好的用途,但这不是其中之一,而且它也反对所有可能的建议来连接'参数vs'绑定'它们。

答案 2 :(得分:-1)

如果该文本字段包含实际存储的pl / sql代码,则唯一可能导致问题的字符是单引号。

因此,用两个单引号替换每个实例,然后将其解析为正确转义的单引号。当然,你必须在replace语句中转义引号才能使它工作,但试试这个:

execute immediate '
           insert into results(SrcProcedure)  values(' ''
           || replace(tabela_temporare(1).text,'''','''''') ||
           '' ')';