Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ODP.Net在Oracle中运行多个查询_Oracle_Plsql_Odp.net - Fatal编程技术网

使用ODP.Net在Oracle中运行多个查询

使用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

我希望能够在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;
/
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游标: