[C# PL/SQL] 4.오라클 프로시저에서 예외 처리 및 C#에서의 에러 핸들링, PL SQL 예외 처리, C# try-catch 블록 활용.

4. 오라클 프로시저에서 예외 처리 및 C#에서의 에러 핸들링

소프트웨어 개발 과정에서 에러 처리는 매우 중요한 요소입니다. 오라클 ProC와 C#은 서로 다른 언어와 환경에서 작업하지만, 두 언어 모두 예외 처리 메커니즘을 제공하여 개발자들이 오류를 관리하고 안정성을 높일 수 있도록 돕습니다. 이 글에서는 오라클 PL/SQL에서의 예외 처리, ProC와 C#에서의 에러 핸들링 기법들에 대해 자세히 알아보겠습니다.

1. 오라클 PL/SQL에서의 예외 처리

PL/SQL은 오라클 데이터베이스를 위한 프로그래밍 언어로, 예외 처리를 위한 강력한 메커니즘을 제공합니다. PL/SQL에서 예외 처리의 기본 구조는 다음과 같습니다:


BEGIN
    -- 코드 블록 ...
EXCEPTION
    WHEN 예외_종류_1 THEN
        -- 예외 처리 코드 ...
    WHEN 예외_종류_2 THEN
        -- 예외 처리 코드 ...
    WHEN OTHERS THEN
        -- 기타 예외 처리 ...
END;

예를 들어, 데이터베이스에서 특정 레코드를 검색하고, 해당 레코드가 없을 경우 예외를 발생시키는 간단한 프로시저를 작성해 보겠습니다:


CREATE OR REPLACE PROCEDURE get_employee_salary (p_emp_id IN NUMBER, p_salary OUT NUMBER) IS
BEGIN
    SELECT salary INTO p_salary FROM employees WHERE employee_id = p_emp_id;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        p_salary := 0;
    WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20001, 'Unexpected error!');
END get_employee_salary;

위 코드에서 get_employee_salary 프로시저는 직원 ID를 입력 받아 해당 직원의 급여를 반환합니다. 만약 지정된 직원 ID가 데이터베이스에 존재하지 않을 경우, NO_DATA_FOUND 예외가 발생하여 급여를 0으로 설정합니다. 그 외의 다른 예외가 발생할 경우, RAISE_APPLICATION_ERROR를 통해 사용자 정의 오류 메시지를 반환합니다.

2. C#에서의 에러 핸들링

C#에서는 try-catch 블록을 사용하여 예외를 처리할 수 있습니다. 다음은 C#의 에러 핸들링 구조입니다:


try
{
    // 코드 블록 ...
}
catch (Exception ex)
{
    // 예외 처리 코드 ...
}
finally
{
    // 항상 수행되는 코드 (옵션) ...
}

이제 PL/SQL 프로시저와 연동되는 C# 코드를 작성하여, 예외 처리의 방법을 살펴보겠습니다. 다음은 오라클 데이터베이스에 연결하고, 프로시저를 호출하는 C# 코드 예제입니다:


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

class Program
{
    static void Main(string[] args)
    {
        int empId = 101;
        decimal salary = 0;

        using (OracleConnection conn = new OracleConnection("your_connection_string"))
        {
            conn.Open();
            using (OracleCommand cmd = new OracleCommand("get_employee_salary", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("p_emp_id", OracleDbType.Int32).Value = empId;
                cmd.Parameters.Add("p_salary", OracleDbType.Decimal).Direction = ParameterDirection.Output;

                try
                {
                    cmd.ExecuteNonQuery();
                    salary = (decimal)cmd.Parameters["p_salary"].Value;
                    Console.WriteLine($"Salary for employee {empId} is {salary}");
                }
                catch (OracleException ex)
                {
                    Console.WriteLine($"Oracle error code: {ex.Number}, message: {ex.Message}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Unexpected error: {ex.Message}");
                }
            }
        }
    }
}

이 C# 프로그램은 주어진 직원 ID에 대해 get_employee_salary 프로시저를 호출하여 급여를 가져옵니다. 예외가 발생할 경우, catch 블록을 통해 OracleException 및 기타 예외를 식별하고 처리합니다.

3. PL/SQL 예외 처리의 구성 요소

PL/SQL에서 예외 처리는 다음과 같은 요소로 구성됩니다:

  • 사전 정의된 예외: Oracle은 다양한 사전 정의된 예외를 제공하며, 이를 이용하여 일반적인 오류를 쉽게 처리할 수 있습니다. 예를 들어, TOO_MANY_ROWS, ZERO_DIVIDE 등의 예외가 있습니다.
  • 사용자 정의 예외: 필요에 따라 개발자가 특정 조건에 따라 발생시킬 수 있는 사용자 정의 예외를 정의할 수 있습니다. 이때 RAISE 문을 사용하여 예외를 발생시킵니다.
  • 예외 필터: WHEN 절을 통해 발생한 예외를 구분하고, 특정 예외에 해당하는 처리 로직을 작성할 수 있습니다.

4. C#의 try-catch 블록 활용

C#의 try-catch 블록은 예외가 발생할 가능성이 있는 코드로 둘러싸여 있으며, 실행 중 발생한 예외에 대해 적절한 조치를 취할 수 있습니다. finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 블록으로, 리소스를 해제하거나 후속 처리를 할 때 유용하게 사용됩니다.

예를 들어, 데이터베이스 연결 운영을 수행한 후, 연결을 안전하게 종료하기 위해 finally 블록을 사용할 수 있습니다:


try
{
    // 데이터베이스 작업 수행 ...
}
catch (OracleException ex)
{
    // Oracle 예외 처리 ...
}
catch (Exception ex)
{
    // 일반 예외 처리 ...
}
finally
{
    // 리소스 해제 코드 ...
}

5. PL/SQL과 C#의 예외 처리 통합

PL/SQL 프로시저에서 발생한 예외에 대해 C#에서 이를 효율적으로 처리하기 위한 방법을 이해하는 것이 중요합니다. 예를 들어, 프로시저에서 RAISE_APPLICATION_ERROR를 사용한 경우, C#에서는 이를 OracleException으로 수신하게 됩니다. 이를 통해 예외 메시지를 받아 클라이언트에서 인지할 수 있습니다.

이와 같은 방식으로 PL/SQL의 예외 처리와 C#의 예외 처리를 통합하여 보다 안정적이고 사용자 친화적인 애플리케이션을 개발할 수 있습니다.

6. 결론

오라클 프로시저와 C# 응용 프로그램 간의 예외 처리 방법을 이해하면, 개발자는 프로그램의 신뢰성을 크게 향상시킬 수 있습니다. PL/SQL의 강력한 예외 처리와 C#의 유연한 에러 핸들링 메커니즘을 적절히 결합하면, 오류 발생 시 사용자에게 유의미한 피드백을 제공하고, 시스템의 일관성을 유지하며, 복잡한 오류 상황을 관리할 수 있습니다.