2009-06-30 14 views
14

Desidero eseguire il batch di più istruzioni select per ridurre i round trip nel database. Il codice ha un aspetto simile allo pseudo codice qui sotto. Funziona perfettamente su SQL Server, ma non funziona su Oracle - Oracle si lamenta della sintassi sql. Ho dato un'occhiata in giro e gli unici esempi che posso trovare di restituire più set di risultati da Oracle stanno usando stored procedure. È possibile farlo in Oracle senza utilizzare stored procedure? Sto usando il fornitore di dati MS Oracle, ma potrei usare ODP.Net se necessario.Batch multiple select statements quando si chiama Oracle da ADO.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); 
} 
+0

http://stackoverflow.com/questions/308963/how -to-split-oracle-sql-statements-for-ado-net – Kirtan

+0

Grazie. Ho dato un'occhiata a quello, ma è uno scenario leggermente diverso, in quanto le istruzioni SQL non restituiscono alcun set di risultati. –

risposta

5

Si dovrebbe scrivere un blocco anonimo pl/sql che restituisce 3 cursori ref.

edit1: Qui è fatto in un blocco pl/sql anonimo con un cursore. Dovrebbe funzionare anche con tre. I cursori ref di Oracle non bloccano i dati e rappresentano il modo più rapido per restituire un set di risultati da una procedura pl/sql o un blocco anonimo di pl/sql.

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

+0

Hmmm. +1 per la risposta. – Kirtan

+1

Il collegamento è ora morto ma qui è una copia archiviata di Internet Archive: http://web.archive.org/web/20060412173402/http://www.oracle.com/technology/oramag/oracle/06-jan /o16odpnet.html –

+0

Il collegamento sembra essere aumentato di circa il 2017, ma adoro la [Wayback Machine] (http://web.archive.org). Mi ha salvato il collo in alcune occasioni. –

0

perché non utilizzare invece le stored procedure?

Tuttavia, se si desidera eseguirne il batch in una query in linea, è possibile utilizzare un punto e virgola (;) per separare le istruzioni.

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

EDIT: si dà un'occhiata al this SO question.

EDIT2: dai un'occhiata a this answer.

+0

Questo dovrebbe funzionare anche in sql server, penso che sia –

+0

Grazie per la risposta. Ho provato a mettere i punti e virgola tra le dichiarazioni ma ho avuto lo stesso problema. Non voglio usare stored proc perché lo sql verrà generato dinamicamente, quindi avremo un numero variabile di set di risultati restituiti. L'esempio fornito è una versione semplificata di ciò che sto facendo. –

+0

Non funziona, hai bisogno di cursori di riferimento. – tuinstoel

0

ne dite:

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

Tutte le colonne dovrebbero essere uguali, ma potrebbero funzionare se lo sono. – vapcguy

9

Un esempio in C# con più cursori e un parametro di ingresso:

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

gentilmente mi potete aiutare con questo http://stackoverflow.com/questions/41306344/how-to-execute-multiple-oracle-query-c-sharp/41308024?noredirect=1#comment69821736_41308024 – sam

+0

Esempio di Daniel così come il L'esempio di collegamento ODP.Net mostra i parametri che vengono aggiunti nello stesso ordine in cui vengono visualizzati nell'istruzione SQL. Se non si trovano nello stesso ordine, verrà visualizzato un errore che indica il numero o il tipo di argomenti errati. Nella maggior parte dei casi questo non è un problema, ma nei casi in cui è necessario aggiungere i parametri fuori sequenza, quindi impostare OracleCommand BindByName = true; –

Problemi correlati