[C# PL/SQL] 3.오라클 프로시저와 C# 간의 데이터 바인딩, 출력 매개변수, RefCursor 사용법, 데이터 테이블로 변환.

1. Introducción

오라클 프로시저(ProC)와 C#은 데이터베이스 애플리케이션 개발에서 매우 중요한 역할을 합니다. 오라클 프로시저는 데이터베이스에서 복잡한 로직을 처리하는 데 사용되며, C#은 사용자 인터페이스와 비즈니스 로직을 연결하는 데 주로 사용됩니다. 이 글에서는 오라클 프로시저와 C# 간의 데이터 바인딩, 출력 매개변수, RefCursor 사용법, 그리고 데이터를 데이터 테이블로 변환하는 방법에 대해 심층적으로 다룰 것입니다.

2. 오라클 프로시저란?

오라클 프로시저는 SQL과 PL/SQL에서 작성된 저장된 프로그램으로, 데이터베이스에서 실행될 수 있는 일련의 명령어들을 포함하고 있습니다. 이러한 프로시저는 효율적으로 데이터 처리를 수행하며, 코드 재사용성을 높이고, 데이터베이스와의 통신을 최적화하는 데 도움을 줍니다.

2.1 프로시저 생성

아래는 오라클에서 프로시저를 만드는 예제입니다. 이 프로시저는 `EMPLOYEE` 테이블에서 직원의 정보를 검색하여 반환합니다.


CREATE OR REPLACE PROCEDURE GetEmployeeInfo (
    p_employee_id IN NUMBER,
    o_employee_name OUT VARCHAR2,
    o_ref_cursor OUT SYS_REFCURSOR
) AS
BEGIN
    SELECT employee_name INTO o_employee_name
    FROM EMPLOYEE
    WHERE employee_id = p_employee_id;

    OPEN o_ref_cursor FOR
    SELECT * FROM EMPLOYEE
    WHERE employee_id = p_employee_id;
END GetEmployeeInfo;
    

3. C#에서 오라클 프로시저 호출하기

C#에서는 `Oracle.DataAccess.Client` 또는 `Oracle.ManagedDataAccess.Client` 네임스페이스를 사용하여 오라클의 프로시저를 호출할 수 있습니다. 여기서는 `Oracle.ManagedDataAccess.Client`를 사용하는 예제를 보겠습니다.

3.1 C# 프로젝트 준비하기

먼저, NuGet 패키지 관리자를 통해 `Oracle.ManagedDataAccess` 패키지를 설치하여 Oracle 데이터베이스와 연결합니다.


Install-Package Oracle.ManagedDataAccess
    

3.2 C# 코드 구현

아래 C# 코드는 오라클 프로시저를 호출하고, 출력 매개변수 및 RefCursor를 처리하는 방법을 보여줍니다.


using System;
using System.Data;
using Oracle.ManagedDataAccess.Client;

class Program
{
    static void Main()
    {
        string connectionString = "User Id=yourUsername;Password=yourPassword;Data Source=yourDataSource;";

        using (OracleConnection connection = new OracleConnection(connectionString))
        {
            connection.Open();

            using (OracleCommand command = new OracleCommand("GetEmployeeInfo", connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                // 입력 매개변수 설정
                command.Parameters.Add("p_employee_id", OracleDbType.Int32).Value = 1;

                // 출력 매개변수 설정
                command.Parameters.Add("o_employee_name", OracleDbType.Varchar2, 100).Direction = ParameterDirection.Output;

                // RefCursor 매개변수 설정
                command.Parameters.Add("o_ref_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

                // 프로시저 실행
                command.ExecuteNonQuery();

                // 출력 매개변수 값 가져오기
                string employeeName = command.Parameters["o_employee_name"].Value.ToString();
                Console.WriteLine("Employee Name: " + employeeName);

                // RefCursor에서 데이터 가져오기
                using (OracleDataReader reader = (OracleDataReader)command.Parameters["o_ref_cursor"].Value)
                {
                    DataTable employeeTable = new DataTable();
                    employeeTable.Load(reader);

                    foreach (DataRow row in employeeTable.Rows)
                    {
                        Console.WriteLine("Employee ID: " + row["employee_id"] + ", Employee Name: " + row["employee_name"]);
                    }
                }
            }
        }
    }
}
    

4. 데이터 바인딩

데이터 바인딩은 애플리케이션의 데이터가 UI 요소와 연결되어 실시간으로 업데이트되는 기능입니다. 오라클 프로시저로 조회한 데이터를 C#의 DataGridView와 같은 UI 요소에 바인딩할 수 있습니다.

4.1 데이터 바인딩 예제

아래 예제는 C# WinForms 애플리케이션에서 Oracle에서 가져온 데이터 테이블을 DataGridView에 바인딩하는 방법을 보여줍니다.


private void BindDataToGrid()
{
    string connectionString = "User Id=yourUsername;Password=yourPassword;Data Source=yourDataSource;";
    DataTable table = new DataTable();

    using (OracleConnection connection = new OracleConnection(connectionString))
    {
        connection.Open();

        using (OracleCommand command = new OracleCommand("GetEmployeeInfo", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("p_employee_id", OracleDbType.Int32).Value = 1;
            command.Parameters.Add("o_ref_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

            using (OracleDataReader reader = (OracleDataReader)command.Parameters["o_ref_cursor"].Value)
            {
                table.Load(reader);
            }
        }
    }

    dataGridView.DataSource = table;
}
    

5. 출력 매개변수와 RefCursor의 차이점

출력 매개변수는 프로시저가 호출된 후 해당 매개변수에 값을 반환하여 호출자에게 정보를 제공합니다. 반면, RefCursor는 주로 여러 개의 행을 반환할 때 사용되며, 일반적으로 SQL 쿼리 결과를 반환하는 데 사용됩니다. 출력 매개변수는 단일 값만을 전달할 수 있지만, RefCursor는 데이터셋을 반환할 수 있으므로 더 유용한 경우가 많습니다.

5.1 비교 표

특징 출력 매개변수 RefCursor
데이터 유형 단일 값 여러 행
사용 목적 간단한 데이터 반환 복잡한 데이터 반환
데이터 구조 단순 데이터 타입 테이블 형식

6. RefCursor를 사용한 데이터 처리

RefCursor를 사용하여 여러 행을 반환받아 처리하는 방법을 설명하겠습니다. 오라클 프로시저에서 RefCursor를 사용하는 예제 코드를 보겠습니다.

6.1 RefCursor 프로시저 예제


CREATE OR REPLACE PROCEDURE GetAllEmployees (
    o_ref_cursor OUT SYS_REFCURSOR
) AS
BEGIN
    OPEN o_ref_cursor FOR
    SELECT * FROM EMPLOYEE;
END GetAllEmployees;
    

위 프로시저는 EMPLOYEE 테이블의 모든 직원 정보를 반환하는 RefCursor를 열어줍니다.

6.2 C#에서 RefCursor 처리


using (OracleCommand command = new OracleCommand("GetAllEmployees", connection))
{
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("o_ref_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

    using (OracleDataReader reader = (OracleDataReader)command.Parameters["o_ref_cursor"].Value)
    {
        DataTable employeeTable = new DataTable();
        employeeTable.Load(reader);

        foreach (DataRow row in employeeTable.Rows)
        {
            Console.WriteLine("Employee ID: " + row["employee_id"] + ", Employee Name: " + row["employee_name"]);
        }
    }
}
    

7. 결론

오라클 프로시저와 C# 간의 데이터 바인딩, 출력 매개변수, RefCursor 사용법, 데이터를 데이터 테이블로 변환하는 방법에 대해 알아보았습니다. 이러한 기술을 활용하면 데이터베이스와 사용자 인터페이스 간의 원활한 상호작용을 구현할 수 있습니다. 이 글이 오라클 프로시저와 C#을 사용하는 데 도움이 되길 바랍니다.