从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:看看这个答案 。