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
C# 从ADO.NET调用Oracle时批处理多个select语句_C#_Oracle_Ado.net_Resultset - Fatal编程技术网

C# 从ADO.NET调用Oracle时批处理多个select语句

C# 从ADO.NET调用Oracle时批处理多个select语句,c#,oracle,ado.net,resultset,C#,Oracle,Ado.net,Resultset,我想批处理多个select语句,以减少往返数据库的次数。代码看起来像下面的伪代码。它在SQL Server上运行得很好,但在Oracle上不起作用-Oracle抱怨SQL语法。我环顾四周,发现从Oracle返回多个结果集的唯一示例是使用存储过程。在Oracle中不使用存储过程就可以做到这一点吗?我正在使用MS Oracle数据提供程序,但如果需要,可以使用ODP.Net数据提供程序 var sql = @" select * from table1

我想批处理多个select语句,以减少往返数据库的次数。代码看起来像下面的伪代码。它在SQL Server上运行得很好,但在Oracle上不起作用-Oracle抱怨SQL语法。我环顾四周,发现从Oracle返回多个结果集的唯一示例是使用存储过程。在Oracle中不使用存储过程就可以做到这一点吗?我正在使用MS Oracle数据提供程序,但如果需要,可以使用ODP.Net数据提供程序

var sql = @"
            select * from table1
            select * from table2
            select * from table3";

DbCommand cmd = GetCommand(sql);
using(var reader = cmd.ExecuteReader())
{
   dt1.Load(reader);
   reader.NextResult();
   dt2.Load(reader);
   reader.NextResult();
   dt3.Load(reader);
}

为什么不使用存储过程呢

但是,如果要在内联查询中批处理它们,可以使用分号;分开陈述

var sql = @"BEGIN
                select * from table1;
                select * from table2;
                select * from table3;
            END;";
编辑:你看看


EDIT2:看看。

您应该编写一个匿名pl/sql块,返回3个引用游标

edit1:在这里,它是在一个匿名pl/sql块中使用一个游标完成的。它也应该和三个一起工作。Oracle ref游标不锁定数据,它们是从pl/sql过程或匿名pl/sql块返回结果集的最快方法

那么:

var sql = @"
            select * from table1 UNION
            select * from table2 UNION
            select * from table3";

C语言中具有多个游标和一个输入参数的示例:

string ConnectionString = "connectionString";
OracleConnection conn = new OracleConnection(ConnectionString);
StringBuilder sql = new StringBuilder();

sql.Append("begin ");
sql.Append("open :1 for select * from table_1 where id = :id; ");
sql.Append("open :2 for select * from table_2; ");
sql.Append("open :3 for select * from table_3; ");
sql.Append("end;");

OracleCommand comm = new OracleCommand(sql.ToString(),_conn);

comm.Parameters.Add("p_cursor_1", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output);

comm.Parameters.Add("p_id", OracleDbType.Int32, Id, ParameterDirection.Input);

comm.Parameters.Add("p_cursor_2", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output);

comm.Parameters.Add("p_cursor_3", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output);

conn.Open();

OracleDataReader dr = comm.ExecuteReader();

谢谢你的回复。我试着在语句之间加上分号,但遇到了同样的问题。我不想使用存储过程,因为sql将动态生成,因此将返回数量可变的结果集。提供的示例是我正在做的工作的简化版本。谢谢。我看了一下,但情况略有不同,因为SQL语句没有返回任何结果集。链接现在已失效,但这是Internet存档的存档副本:链接似乎在2017年左右出现,但我确实喜欢它。有几次,它救了我的命。所有的列都必须是相同的,但如果它们是相同的,也可以工作。请您帮助我完成这个Daniel的示例以及ODP.Net链接示例,它显示了以与SQL语句中相同的顺序添加的参数。如果它们的顺序不同,您将得到一个错误,说明错误的参数数量或类型。在大多数情况下,这不是问题,但在需要无序添加参数的情况下,请设置OracleCommand BindByName=true;