다음을 통해 공유


출력 매개 변수가 있는 저장 프로시저 사용

JDBC 드라이버 다운로드

호출할 수 있는 SQL Server 저장 프로시저는 OUT 매개 변수를 하나 이상 반환하는 저장 프로시저입니다. 여기서 매개 변수는 저장 프로시저에서 데이터를 호출 애플리케이션으로 다시 반환하는 데 사용됩니다. SQL Server용 Microsoft JDBC 드라이버는 이러한 종류의 저장 프로시저를 호출하여 반환되는 데이터를 처리하는 데 사용할 수 있는 SQLServerCallableStatement 클래스를 제공합니다.

JDBC 드라이버를 사용하여 이러한 종류의 저장 프로시저를 호출하는 경우에는 call SQL 이스케이프 시퀀스와 함께 SQLServerConnection 클래스의 prepareCall 메서드를 사용해야만 합니다. OUT 매개 변수가 있는 call 이스케이프 시퀀스의 구문은 다음과 같습니다.

{call procedure-name[([parameter][,[parameter]]...)]}

참고 항목

SQL 이스케이프 시퀀스에 대한 자세한 내용은 SQL 이스케이프 시퀀스 사용을 참조하세요.

call 이스케이프 시퀀스를 구성할 때 OUT 매개 변수를 지정하려면 ? (물음표) 문자를 사용합니다. 이 문자는 저장 프로시저에서 반환될 매개 변수 값의 자리 표시자로 기능합니다. OUT 매개 변수에 대한 값을 지정하려면 저장 프로시저를 실행하기 전에 SQLServerCallableStatement 클래스의 registerOutParameter 메서드를 사용하여 각 매개 변수의 데이터 형식을 지정해야 합니다.

registerOutParameter 메서드에서 OUT 매개 변수에 대해 지정하는 값은 java.sql.Types에 들어 있는 JDBC 데이터 형식 중 하나여야 합니다. 또한 이 값은 네이티브 SQL Server 데이터 형식 중 하나에 매핑됩니다. JDBC 및 SQL Server 데이터 형식에 관한 자세한 내용은 JDBC 드라이버 데이터 형식 이해를 참조하세요.

OUT 매개 변수에 대한 registerOutParameter 메서드에 값을 전달하는 경우 해당 매개 변수에 사용할 데이터 형식은 물론 저장 프로시저 호출에서 매개 변수의 서수 위치 또는 매개 변수의 이름도 지정해야 합니다. 예를 들어 저장 프로시저에 단일 OUT 매개 변수가 포함된 경우 해당 서수 값은 1이 됩니다. 저장 프로시저에 두 개의 매개 변수가 포함되어 있으면 첫 번째 서수 값은 1이고 두 번째 서수 값은 2가 됩니다.

참고 항목

JDBC 드라이버에서는 OUT 매개 변수로 CURSOR, SQLVARIANT, TABLE, TIMESTAMP와 같은 SQL Server 데이터 형식을 사용할 수 없습니다.

이에 대한 예로 AdventureWorks2022 샘플 데이터베이스에 다음 저장 프로시저를 만듭니다.

CREATE PROCEDURE GetImmediateManager  
   @employeeID INT,  
   @managerID INT OUTPUT  
AS  
BEGIN  
   SELECT @managerID = ManagerID
   FROM HumanResources.Employee
   WHERE EmployeeID = @employeeID  
END

이 저장 프로시저는 지정된 IN 매개 변수(employeeID)(정수)를 기반으로 단일 OUT 매개 변수(managerID)(정수)를 반환합니다. OUT 매개 변수에 반환되는 값은 HumanResources.Employee 테이블에 포함된 EmployeeID를 기반으로 하는 ManagerID입니다.

다음 예제에서는 AdventureWorks2022 샘플 데이터베이스에 대해 열린 연결을 함수로 전달하고 execute 메서드를 사용하여 GetImmediateManager 저장 프로시저를 호출합니다.

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");) {  
        cstmt.setInt(1, 5);  
        cstmt.registerOutParameter(2, java.sql.Types.INTEGER);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt(2));  
    }  
}

이 예제에서는 서수 위치를 사용하여 매개 변수를 식별합니다. 또는, 서수 위치 대신 이름을 사용하여 매개 변수를 식별할 수도 있습니다. 다음 코드 예에서는 이전 예를 수정하여 Java 애플리케이션에서 명명된 매개 변수를 사용하는 방법을 설명합니다. 매개 변수 이름은 저장 프로시저의 정의에 있는 매개 변수 이름에 해당합니다.

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {  
        cstmt.setInt("employeeID", 5);  
        cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));  
    }  
}

드라이버 버전 12.6 이상에서는 새 연결 속성 useFlexibleCallableStatements가 도입되었습니다. true로 설정 시 이 속성은 드라이버의 이전 동작을 유지하므로, 사용자가 매개 변수를 식별할 때 서수 위치와 매개 변수 이름을 혼합하여 사용할 수 있습니다. false로 설정 시 사용자는 하나 또는 다른 하나를 사용해야 하며 둘 다 사용할 수는 없습니다.

또한 속성을 true로 설정하면 useFlexibleCallableStatements에서는 유연한 순서의 문 매개 변수를 설정할 수 있는 기존 동작을 유지합니다. 그러나 false로 설정하면 순서가 저장 프로시저 정의와 일치해야 합니다. 다음 예제에서는 이러한 useFlexibleCallableStatements=true의 두 기능을 모두 확인할 수 있습니다.

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {
        cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
        cstmt.setInt(1, 5);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));  
    }  
}

참고 항목

이러한 예제에서는 SQLServerCallableStatement 클래스의 execute 메서드를 사용하여 저장 프로시저를 실행합니다. 저장 프로시저 역시 결과 집합을 반환하지 않았기 때문에 이 메서드를 사용합니다. 결과 집합이 반환되었다면 executeQuery 메서드를 사용하게 됩니다.

저장 프로시저는 업데이트 수 및 여러 결과 집합을 반환할 수 있습니다. SQL Server용 Microsoft JDBC 드라이버는 OUT 매개 변수를 검색하기 전에 다중 결과 집합 및 업데이트 횟수를 검색해야 한다는 JDBC 3.0 사양을 따릅니다. 즉, 응용 프로그램에서는 CallableStatement.getter 메서드를 사용하여 OUT 매개 변수를 검색하기 전에 모든 ResultSet 개체와 업데이트 수를 검색해야 합니다. 그렇게 하지 않고 OUT 매개 변수를 검색하면, 아직 검색되지 않은 ResultSet 개체 및 업데이트 수가 사라지게 됩니다. 업데이트 횟수 및 여러 결과 집합에 대한 자세한 내용은 업데이트 횟수가 있는 저장 프로시저 사용여러 결과 집합 사용을 참조하세요.

참고 항목

저장 프로시저가 있는 문 사용