programing

ADO.NET에서 Oracle을 호출할 때 여러 개의 선택 문 배치

batch 2023. 7. 20. 21:49
반응형

ADO.NET에서 Oracle을 호출할 때 여러 개의 선택 문 배치

데이터베이스에 대한 왕복을 줄이기 위해 여러 선택 문을 일괄 처리합니다.코드는 아래의 유사 코드와 같습니다.SQL Server에서는 완벽하게 작동하지만 Oracle에서는 작동하지 않습니다. Oracle은 SQL 구문에 대해 불평합니다.둘러보았는데 Oracle에서 여러 결과 집합을 반환하는 유일한 예는 저장 프로시저를 사용하는 것입니다.저장 프로시저를 사용하지 않고 Oracle에서 이 작업을 수행할 수 있습니까?저는 MS Oracle 데이터 공급자를 사용하고 있지만 ODP를 사용할 수 있습니다.필요한 경우 넷 원.

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

여러 커서와 입력 파라미터가 있는 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();

3개의 참조를 반환하는 익명 pl/sql 블록을 작성해야 합니다.

edit1: 여기서는 하나의 커서로 익명 pl/sql 블록에서 수행됩니다.3개도 같이 해야 돼요.Oracle 참조 커서는 데이터를 잠그지 않으며 pl/sql 프로시저 또는 익명 pl/sql 블록의 결과 집합을 반환하는 가장 빠른 방법입니다.

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

어때요?

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

대신 저장 프로시저를 사용하는 것이 어떻습니까?

그러나 인라인 쿼리로 배치하려는 경우 세미콜론(;)을 사용하여 문을 구분할 수 있습니다.

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

편집: 이 SO 질문을 살펴봅니다.

EDIT2: 이 답변을 살펴보십시오.

언급URL : https://stackoverflow.com/questions/1062569/batch-multiple-select-statements-when-calling-oracle-from-ado-net

반응형