我正在做作业。我需要能够通过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#。
答案 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;
该功能不是很完美,但是您可以对其进行调整。.很好,它起作用了!