Batch mehr select-Anweisungen, wenn Oracle aus ADO.NET Aufruf
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);
}
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 .