使用c#String通过OracleParameter执行IMMEDIATE,引用scaping

时间:2013-10-19 19:47:39

标签: c# oracle stored-procedures dynamic-sql execute-immediate

我正在做作业。我需要能够通过Oracle中的存储过程执行SQL语句。

我可以在SQLDeveloper中使用类似的东西:

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

区域表非常简单,idvarchar。该块在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#。

2 个答案:

答案 0 :(得分:0)

你真的应该看一下使用存储过程的参数而不是传递整个sql字符串。它将处理转义问题,并且不容易受到sql注入的攻击。<​​/ p>

答案 1 :(得分:0)

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

函数听起来像这样:

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;

该功能不是很完美,但是您可以对其进行调整。.很好,它起作用了!