Frage

Ich möchte Batch mehrere select-Anweisungen Umläufe in die Datenbank zu reduzieren. Der Code sieht so etwas wie der Pseudo-Code unten. Es funktioniert perfekt auf SQL Server, funktioniert aber nicht auf Oracle - Oracle über die SQL-Syntax beschwert. Ich habe einen Blick um hatte und die einzigen Beispiele kann ich von der Rückkehr mehr Ergebnismengen von Oracle finden verwenden Stored Procedures. Ist es möglich, ohne die Verwendung von Stored Procedures dies in Oracle zu tun? Ich bin mit dem MS Oracle Data Provider, kann aber das ODP.Net man verwenden, wenn nötig.

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);
}
War es hilfreich?

Lösung

Sie sollten einen anonymen PL / SQL-Block schreiben, die 3 ref Cursor zurückgibt.

edit1: Hier ist es in einem anonymen PL / SQL-Block mit einem Cursor durchgeführt wird. Es sollte auch mit drei arbeiten. Oracle Ref Cursor sperrt Daten nicht und sie sind der schnellste Weg, ein Ergebnis aus einer PL / SQL-Prozedur oder einen anonymen PL / SQL-Block gesetzt zurückzukehren.

http://www.oracle .com / TechNetwork / Ausgabe-Archiv / 2006/06-Jan / o16odpnet-087852.html

Andere Tipps

Ein Beispiel in C # mit mehreren Cursors und einem Eingabeparameter:

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

Wie wäre:

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

warum nicht gespeicherte Prozeduren statt?

Aber, wenn Sie sie in einem Inline-Abfrage zu Charge möchten, können Sie ein Semikolon (;)., Um die Aussagen zu trennen

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

EDIT: Sie nehmen einen Blick auf diese Frage SO .

EDIT2: Werfen Sie einen Blick auf diese Antwort .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top