从ADO.NET调用的Oracle当批多个SELECT语句(Batch multiple selec

2019-06-24 12:51发布

我想批量多个SELECT语句,以减少往返数据库。 代码看起来像下面的伪代码。 它完美SQL Server上,但在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);
}

Answer 1:

你应该写一个匿名PL / SQL块,返回3个引用游标。

EDIT1:这是在一个匿名PL / SQL块与一个光标来完成。 它应该有三个工作了。 甲骨文引用游标不锁定数据,他们是返回从PL / SQL程序或匿名PL / SQL集团设定结果的最快方法。

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



Answer 2:

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


Answer 3:

怎么样:

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


Answer 4:

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

但是,如果你想批量他们在联查询,你可以使用一个分号(;)以单独的语句。

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

编辑:你看看这太问题 。

EDIT2:看看这个答案 。



文章来源: Batch multiple select statements when calling Oracle from ADO.NET