将存储过程的文本插入到记录中
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:
- 这会非常慢,因为对于每个循环迭代,您都需要重新编译动态 SQL。
- SQL本身会因为无法缓存而执行得更慢
- 您有 SQL 注入的危险,可能导致错误和安全问题。您认为您通过搜索和替换引号修复了它,但我敢打赌您可能没有考虑到某些情况。
- 搜索和替换引号的过程本身也非常慢。
动态 SQL 有很好的用途,但这不是其中之一,它也违反了对 'concatenate' 参数与 'binding' 参数的所有可能建议。
如何将存储在 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:
- 这会非常慢,因为对于每个循环迭代,您都需要重新编译动态 SQL。
- SQL本身会因为无法缓存而执行得更慢
- 您有 SQL 注入的危险,可能导致错误和安全问题。您认为您通过搜索和替换引号修复了它,但我敢打赌您可能没有考虑到某些情况。
- 搜索和替换引号的过程本身也非常慢。
动态 SQL 有很好的用途,但这不是其中之一,它也违反了对 'concatenate' 参数与 'binding' 参数的所有可能建议。