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

Inserting the text of a stored procedure into a record

如何将存储在 ALL_SOURCE.TEXT 中的过程文本插入到记录中?

这部分代码给我错误:"missing comma"

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

我认为这是由于存储过程的文本中包含未转义字符所致,但我找不到解决方法。

如果要在 Varchar 中包含字符串分隔符(撇号:'),则必须使用两个连续的撇号,然后再使用一个撇号结束字符串。它给你一个错误,因为你先结束了字符串。 试试这段代码:

EXECUTE IMMEDIATE 'INSERT INTO results(SrcProcedure)  values(''' || tabela_temporare(1).text || ''')';

编辑: 更好地使用绑定变量,请参阅我的示例代码:

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;

我希望它现在有效! :)

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

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

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

在您的 PL/SQL:

中简单地执行此操作怎么样?
INSERT INTO results(SrcProcedure) VALUES (tabela_temporare(1).text);

在内部,它将使用绑定变量将您的 PL/SQL 变量传递到 INSERT。

请注意,强烈建议远离动态 SQL(EXECUTE IMMEDIATE 等),因为该代码容易出现 SQL injection.

[更新] 我不知道还能说什么。但是考虑这些事情,以便在使用字符串搜索和替换的 FOR 循环中使用动态构建的 SQL:

  1. 这会非常慢,因为对于每个循环迭代,您都需要重新编译动态 SQL。
  2. SQL本身会因为无法缓存而执行得更慢
  3. 您有 SQL 注入的危险,可能导致错误和安全问题。您认为您通过搜索和替换引号修复了它,但我敢打赌您可能没有考虑到某些情况。
  4. 搜索和替换引号的过程本身也非常慢。

动态 SQL 有很好的用途,但这不是其中之一,它也违反了对 'concatenate' 参数与 'binding' 参数的所有可能建议。