16

我想批处理多个选择语句以减少到数据库的往返。该代码类似于下面的伪代码。它在 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);
}
4

4 回答 4

11

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();
于 2010-06-18T15:34:41.683 回答
6

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

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

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

于 2009-06-30T16:30:51.330 回答
0

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

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

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

编辑:你看看这个 SO question

EDIT2:看看这个答案

于 2009-06-30T09:05:33.067 回答
0

怎么样:

var sql = @"
            select * from table1 UNION
            select * from table2 UNION
            select * from table3";
于 2009-06-30T17:31:23.027 回答