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;";
EDIT2: 이 답변을 살펴보십시오.
언급URL : https://stackoverflow.com/questions/1062569/batch-multiple-select-statements-when-calling-oracle-from-ado-net
'programing' 카테고리의 다른 글
스프링 보안에서 현재 로그인한 사용자 개체를 가져오는 방법은 무엇입니까? (0) | 2023.07.25 |
---|---|
마리아드브:MySQL 서버가 사라졌습니다. (0) | 2023.07.25 |
ORA-01799: 열을 하위 쿼리에 외부 결합할 수 없습니다. (0) | 2023.07.20 |
각 행에 대한 특정 필드가 있는 모든 행의 쿼리 집합을 얻는 방법은 무엇입니까? (0) | 2023.07.20 |
사이톤의 복소수 (0) | 2023.07.20 |