使用ODP.Net在Oracle中运行多个查询
我希望能够在ODP.Net中运行以select语句结尾的多个查询。我正在清除、更新,然后从表中进行选择 例如:使用ODP.Net在Oracle中运行多个查询,oracle,plsql,odp.net,Oracle,Plsql,Odp.net,我希望能够在ODP.Net中运行以select语句结尾的多个查询。我正在清除、更新,然后从表中进行选择 例如: BEGIN DELETE FROM StagingTable; INSERT INTO StagingTable (Col1,Col2,Col3) SELECT Value1,Value2,Value3 FROM MainTable; UPDATE StagingTable SET Col1 = FUNCTION(Col1); END
BEGIN
DELETE FROM StagingTable;
INSERT INTO StagingTable (Col1,Col2,Col3)
SELECT Value1,Value2,Value3
FROM MainTable;
UPDATE StagingTable
SET Col1 = FUNCTION(Col1);
END;
/
SELECT * FROM StagingTable;
这适用于SQL Developer,但不适用于ODP.Net。我得到这个错误:
ORA-06550:第26行第1列:
PLS-00103:遇到符号“/”
但是,如果我删除/I获得:
ORA-06550:第27行第1列:
PLS-00103:遇到符号“选择”
我想做的事情可能吗?我不想必须创建一个包并开始创建类型等等。理想情况下,我希望通过.Net来实现这一点 与使用t-SQL的SQL Server不同,oracle有两个上下文:SQL Plus和PL/SQL(开始/结束是一个匿名plsql块,其中外部选择是SQL Plus)。我还没有找到在plsql块启动后从SQL Plus查询返回集合的方法 但是,您当然可以在plsql块中执行所有这些操作,并返回ref游标:
OracleCommand cmd = new OracleCommand(
@"
declare
localUseVar varchar(50);
begin
select dummy into localUseVar from dual;
open :refcursor for
select dummy, localUseVar FROM DUAL
where :fakeparam=:fakeparam;
end;
");
cmd.BindByName = true;
cmd.Parameters.Add("fakeparam", "fake");
cmd.Parameters.Add("refcursor", OracleDbType.RefCursor).Direction = System.Data.ParameterDirection.Output;
using (cmd.Connection = new OracleConnection("DATA SOURCE=localhost:1521/xe; PERSIST SECURITY INFO = True; USER ID = TEMPLATE; Password=password"))
{
cmd.Connection.Open();
var reader = cmd.ExecuteReader();
Assert.IsTrue(reader.Read());
Assert.AreEqual(reader[0], reader[1]);
}
更多信息请点击此处:
您的具体案例将类似于:
OracleCommand cmd = new OracleCommand(
@"
begin
DELETE FROM StagingTable;
INSERT INTO StagingTable (Col1,Col2,Col3)
SELECT Value1,Value2,Value3
FROM MainTable;
UPDATE StagingTable
SET Col1 = FUNCTION(Col1);
open :refcursor for SELECT * FROM StagingTable;
end;
");
cmd.BindByName = true;
cmd.Parameters.Add("refcursor", OracleDbType.RefCursor).Direction = System.Data.ParameterDirection.Output;
using (cmd.Connection = new OracleConnection("DATA SOURCE=localhost:1521/xe; PERSIST SECURITY INFO = True; USER ID = TEMPLATE; Password=password"))
{
cmd.Connection.Open();
var reader = cmd.ExecuteReader();
}
你不能那样做。要么将所有内容都放在存储过程中,并将select作为游标返回,要么分为两次执行。正如OldProgrammer所建议的,您使用的是SQL*Plus语法(反斜杠),这对SQL Developer和类似工具很好,但不适用于编程接口。您可以使用绑定变量从ODP.NET调用匿名PLSQL。您可以将整个过程放到一个匿名PL/SQL块中,并在最后绑定到一个REF游标。然后从中获取。下面是一些示例代码,显示如何从odp.net调用匿名plsql块,然后绑定到ref游标: