.NET Framework Data Provider for Oracle은 SQL 배치 문을 지원하지 않습니다. 그러나 여러 REF CURSOR 출력 매개 변수를 사용하여 각 DataTable에 있는DataSet을 채울 수 있습니다. 매개 변수를 정의하고 출력 매개 변수로 표시한 다음 REF CURSOR 데이터 형식으로 나타냅니다. Oracle은 SQL 문이 실행될 때 테이블 이름과 열 이름을 확인하는 데 필요한 정보를 제공하지 않으므로 OracleDataAdapter가 저장 프로시저에서 반환하는 REF CURSOR 매개 변수를 사용하여 채워질 때 Update 메서드를 사용할 수 없습니다. 다음 C# 예제에서는 이 저장 프로시저를 만든 것으로 가정합니다.
Oracle 서버에 다음 Oracle 패키지를 만듭니다.
1 2 3 4 5 6 7 8 9 10 |
CREATE OR REPLACE PACKAGE CURSPKG AS TYPE T_CURSOR IS REF CURSOR; PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, IO_CURSOR OUT T_CURSOR); PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, DEPTCURSOR OUT T_CURSOR); END CURSPKG; / |
Oracle 서버에 다음 Oracle 패키지 본문을 만듭니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
CREATE OR REPLACE PACKAGE BODY CURSPKG AS PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, IO_CURSOR OUT T_CURSOR) IS V_CURSOR T_CURSOR; BEGIN IF N_EMPNO <> 0 THEN OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.EMPNO = N_EMPNO; ELSE OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; END IF; IO_CURSOR := V_CURSOR; END OPEN_ONE_CURSOR; PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, DEPTCURSOR OUT T_CURSOR) IS V_CURSOR1 T_CURSOR; V_CURSOR2 T_CURSOR; BEGIN OPEN V_CURSOR1 FOR SELECT * FROM EMP; OPEN V_CURSOR2 FOR SELECT * FROM DEPT; EMPCURSOR := V_CURSOR1; DEPTCURSOR := V_CURSOR2; END OPEN_TWO_CURSORS; END CURSPKG; / |
다음 C# 예제에서는 저장 프로시저를 사용하여 테이블 및 열 정보를 가져오는 방법을 보여 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// GetConnectionString() returns a connection string for // the data source. string connString = GetConnectionString(); DataSet ds = new DataSet(); OracleConnection conn = new OracleConnection(connString); OracleCommand cmd = conn.CreateCommand(); cmd.CommandText = "CURSPKG.OPEN_TWO_CURSORS"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output; cmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output; OracleDataAdapter da = new OracleDataAdapter(cmd); da.TableMappings.Add("Table", "Emp"); da.TableMappings.Add("Table1", "Dept"); da.Fill(ds); ds.Relations.Add("EmpDept", ds.Tables["Dept"].Columns["Deptno"], ds.Tables["Emp"].Columns["Deptno"], false); |