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

我想批处理多个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); } 

你应该编写一个匿名的pl / sql块来返回3个ref游标。

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

http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html

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(); 

怎么样:

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

为什么不使用存储过程呢?

但是,如果要在内联查询中批处理它们,可以使用分号(;)分隔语句。

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

编辑:你看看这个问题 。

编辑2:看看这个答案 。