1

我目前正在执行一项任务。我需要能够通过 Oracle 中的存储过程执行 SQL 语句。

我可以在 SQLDeveloper 中做到这一点,使用类似:

declare
n varchar2(100);
begin
   n := 'insert into REGION(ID_REGION, NOMBRE_REGION) values(10,''DESAMPA'')';
   EXECUTE IMMEDIATE n;
end;

区域表非常简单,一个id和一个varchar。该块在 SQL Developer 中有效。但是,我需要在这个存储过程中调用它:

Procedure Hacer_Query (P_Query in Varchar2)
AS
EXECUTE IMMEDIATE P_Query;
END;

此过程也有效。但是,我无法从 C# 调用此过程。出于某种原因,我收到 ORA-00900 无效 SQL 错误。我相信这可能与单引号的缩放有关,因为

SELECT nombre_region FROM REGION:

当我将它存储在游标中时,它可以从 C# 工作。我正在使用 OracleParameter 将其发送到过程:

"insert into REGION(ID_REGION, NOMBRE_REGION) values(11,'DESAMPA')"

有什么特殊的方法可以做到这一点吗?引号有什么特殊语法吗?

谢谢您的帮助!

编辑:

EXECUTE IMMEDIATE  'insert into REGION(ID_REGION, NOMBRE_REGION) values(10,''DESAMPA'')';

不起作用。似乎它只能在一个块内工作。我觉得我在这里错过了一些东西......

没关系最后一部分,我现在从一个块中调用它。但是仍然不能在 C# 中工作。

4

2 回答 2

1

尝试创建一个调用它的函数,并在您的存储过程中使用此函数。

函数听起来像这样:

CREATE OR REPLACE FUNCTION SISADMIN.EXECSQL(SQL1 VARCHAR2) RETURN VARCHAR2 IS
  FUNCTIONRESULT VARCHAR2(1000);
BEGIN
  EXECUTE IMMEDIATE SQL1;
  RETURN(FUNCTIONRESULT);
END EXECSQL;

DECLARE 
  TESTE VARCHAR2(100);
BEGIN 
  TESTE :=  SISADMIN.EXECSQL('insert into REGION(ID_REGION, NOMBRE_REGION) values(10,''DESAMPA'')');
END;

功能不完善,但可以调整..好吧,它工作!

于 2019-04-05T13:56:28.353 回答
0

您确实应该考虑对存储过程使用参数,而不是传递整个 sql 字符串。它将处理转义问题并且不易受到 sql 注入的影响。

于 2013-10-19T20:36:38.063 回答