Пакетные операторы множественного выбора при вызове Oracle из ADO.NET - PullRequest
14 голосов
/ 30 июня 2009

Я хочу пакетировать несколько операторов выбора, чтобы уменьшить количество обращений к базе данных. Код выглядит примерно так, как псевдокод ниже. Он отлично работает на 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 ]

10 голосов
/ 18 июня 2010

Пример в 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();
6 голосов
/ 30 июня 2009

Вы должны написать анонимный блок pl / sql, который возвращает 3 курсора ссылки.

edit1: Здесь это делается в анонимном блоке pl / sql с одним курсором. Это должно работать с тремя тоже. Рефлекторы Oracle не блокируют данные и являются самым быстрым способом возврата набора результатов из процедуры pl / sql или анонимного блока pl / sql.

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

0 голосов
/ 30 июня 2009

Как насчет:

var sql = @"
            select * from table1 UNION
            select * from table2 UNION
            select * from table3";
0 голосов
/ 30 июня 2009

почему бы не использовать вместо этого хранимые процедуры?

Но, если вы хотите объединить их во встроенный запрос, вы можете использовать точку с запятой (;) для разделения операторов.

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

РЕДАКТИРОВАТЬ: Вы посмотрите на этот вопрос .

EDIT2: взгляните на этот ответ .

...