이 기사의 저자는 Java를 통해 SQL Server의 저장 프로시저를 호출하는 방법을 소개하고 다섯 가지 유형의 저장소에 대해 자세히 설명합니다. 자세한 내용은 아래를 참조하세요.
1. 매개변수 없이 저장 프로시저를 사용하세요.
JDBC 드라이버를 사용하여 매개 변수 없이 저장 프로시저를 호출하는 경우 호출 SQL 이스케이프 시퀀스를 사용해야 합니다. 매개변수가 없는 호출 이스케이프 시퀀스의 구문은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
{호출 프로시저 이름}
예를 들어 SQL Server 2005 AdventureWorks 샘플 데이터베이스에서 다음 저장 프로시저를 만듭니다.
다음과 같이 코드 코드를 복사합니다.
절차 만들기 GetContactFormalNames
처럼
시작하다
TOP 10 선택 직함 + ' ' + 이름 + ' ' + 성 AS FormalName
FROM 사람.연락처
끝
이 저장 프로시저는 Person.Contact 테이블에 있는 처음 10개 연락처의 제목, 이름, 성으로 구성된 데이터 열을 포함하는 단일 결과 집합을 반환합니다.
다음 예에서는 이 함수에 AdventureWorks 샘플 데이터베이스에 대한 열린 연결이 전달된 다음, ExecuteQuery 메서드를 사용하여 GetContactFormalNames 저장 프로시저가 호출됩니다.
다음과 같이 코드 코드를 복사합니다.
공개 정적 무효 실행SprocNoParams(Connection con) ...{
노력하다...{
명령문 stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");
동안(rs.next()) ...{
System.out.println(rs.getString("FormalName"));
}
rs.close();
stmt.close();
}
catch (예외 e) ...{
e.printStackTrace();
}
}
2. 입력 매개변수와 함께 저장 프로시저 사용
JDBC 드라이버를 사용하여 매개 변수가 있는 저장 프로시저를 호출하는 경우 SQLServerConnection 클래스의 prepareCall 메서드와 함께 호출 SQL 이스케이프 시퀀스를 사용해야 합니다. IN 매개변수가 있는 호출 이스케이프 시퀀스의 구문은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
{호출 프로시저 이름[([매개변수][,[매개변수]]...)]}
호출 이스케이프 시퀀스를 구성할 때 ?(물음표) 문자를 사용하여 IN 매개변수를 지정합니다. 이 문자는 저장 프로시저에 전달될 매개변수 값의 자리 표시자 역할을 합니다. SQLServerPreparedStatement 클래스의 setter 메서드 중 하나를 사용하여 매개 변수 값을 지정할 수 있습니다. 사용 가능한 setter 메소드는 IN 매개변수의 데이터 유형에 따라 결정됩니다.
setter 메서드에 값을 전달할 때 매개 변수에 사용할 실제 값뿐만 아니라 저장 프로시저 내 매개 변수의 순서 위치도 지정해야 합니다. 예를 들어, 저장 프로시저에 단일 IN 매개변수가 포함된 경우 해당 서수 값은 1입니다. 저장 프로시저에 두 개의 매개변수가 포함된 경우 첫 번째 서수 값은 1이고 두 번째 서수 값은 2입니다.
IN 매개 변수가 포함된 저장 프로시저를 호출하는 방법의 예로 SQL Server 2005 AdventureWorks 샘플 데이터베이스의 uspGetEmployeeManagers 저장 프로시저를 사용하세요. 이 저장 프로시저는 정수 값인 EmployeeID라는 단일 입력 매개 변수를 허용하고 지정된 EmployeeID를 기반으로 직원 및 해당 관리자의 재귀 목록을 반환합니다. 다음은 이 저장 프로시저를 호출하는 Java 코드입니다.
다음과 같이 코드 코드를 복사합니다.
공개 정적 무효 실행SprocInParams(Connection con) ...{
노력하다...{
ReadyStatement pstmt = con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
pstmt.setInt(1, 50);
ResultSet rs = pstmt.executeQuery();
동안(rs.next()) ...{
System.out.println("직원:");
System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
System.out.println("관리자:");
System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
System.out.println();
}
rs.close();
pstmt.close();
}
catch (예외 e) ...{
e.printStackTrace();
}
}
3. 출력 매개변수와 함께 저장 프로시저 사용
JDBC 드라이버를 사용하여 이러한 저장 프로시저를 호출하는 경우 SQLServerConnection 클래스의 prepareCall 메서드와 함께 호출 SQL 이스케이프 시퀀스를 사용해야 합니다. OUT 매개변수가 있는 호출 이스케이프 시퀀스의 구문은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
{호출 프로시저 이름[([매개변수][,[매개변수]]...)]}
호출 이스케이프 시퀀스를 구성할 때 ?(물음표) 문자를 사용하여 OUT 매개변수를 지정합니다. 이 문자는 이 저장 프로시저에서 반환될 매개변수 값에 대한 자리 표시자 역할을 합니다. OUT 매개변수의 값을 지정하려면 저장 프로시저를 실행하기 전에 SQLServerCallableStatement 클래스의 RegisterOutParameter 메서드를 사용하여 각 매개변수의 데이터 형식을 지정해야 합니다.
RegisterOutParameter 메소드를 사용하여 OUT 매개변수에 지정된 값은 java.sql.Types에 포함된 JDBC 데이터 유형 중 하나여야 하며, 이는 기본 SQL Server 데이터 유형 중 하나로 매핑됩니다. JDBC 및 SQL Server 데이터 유형에 대한 자세한 내용은 JDBC 드라이버 데이터 유형 이해를 참조하세요.
OUT 매개변수에 대한 값을 RegisterOutParameter 메소드에 전달할 때 매개변수에 사용할 데이터 유형을 지정해야 할 뿐만 아니라 저장 프로시저에서 매개변수의 순서 위치 또는 매개변수 이름도 지정해야 합니다. 예를 들어, 저장 프로시저에 단일 OUT 매개변수가 포함된 경우 해당 서수 값은 1입니다. 저장 프로시저에 두 개의 매개변수가 포함되어 있으면 첫 번째 서수 값은 1이고 두 번째 서수 값은 2입니다.
예를 들어, SQL Server 2005 AdventureWorks 샘플 데이터베이스에서 다음 저장 프로시저를 만듭니다. 지정된 정수 IN 매개 변수(employeeID)를 기반으로 이 저장 프로시저는 단일 정수 OUT 매개 변수(managerID)도 반환합니다. HumanResources.Employee 테이블에 포함된 EmployeeID를 기반으로 OUT 매개 변수에 반환된 값은 ManagerID입니다.
다음 예에서는 이 함수에 AdventureWorks 샘플 데이터베이스에 대한 열린 연결이 전달된 다음, 실행 메서드를 사용하여 GetImmediateManager 저장 프로시저가 호출됩니다.
다음과 같이 코드 코드를 복사합니다.
public static void excuteStoredProcedure(Connection con) ...{
노력하다...{
CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
cstmt.setInt(1, 5);
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.execute();
System.out.println("관리자 ID: " + cstmt.getInt(2));
}
catch (예외 e) ...{
e.printStackTrace();
}
}
이 예에서는 순서 위치를 사용하여 매개변수를 식별합니다. 또는 매개변수는 순서 위치가 아닌 이름으로 식별될 수 있습니다. 다음 코드 예제에서는 이전 예제를 수정하여 Java 애플리케이션에서 명명된 매개 변수를 사용하는 방법을 보여줍니다. 이러한 매개변수 이름은 저장 프로시저 정의의 매개변수 이름에 해당합니다. 11x16CREATE PROCEDURE GetImmediateManager
다음과 같이 코드 코드를 복사합니다.
@employeeID INT,
@managerID 내부 출력
처럼
시작하다
SELECT @managerID = 관리자ID
HumanResources.Employee에서
WHERE 직원ID = @employeeID
끝
저장 프로시저는 업데이트 횟수와 여러 결과 집합을 반환할 수 있습니다. Microsoft SQL Server 2005 JDBC 드라이버는 OUT 매개 변수를 검색하기 전에 여러 결과 집합과 업데이트 횟수를 검색해야 한다는 JDBC 3.0 사양을 준수합니다. 즉, 애플리케이션은 먼저 모든 ResultSet 객체를 검색하고 개수를 업데이트한 다음 CallableStatement.getter 메소드를 사용하여 OUT 매개변수를 검색해야 합니다. 그렇지 않으면 OUT 매개변수가 검색될 때 아직 검색되지 않은 ResultSet 개체와 업데이트 횟수가 손실됩니다.
4. 반환 상태와 함께 저장 프로시저 사용
JDBC 드라이버를 사용하여 이러한 저장 프로시저를 호출하는 경우 SQLServerConnection 클래스의 prepareCall 메서드와 함께 호출 SQL 이스케이프 시퀀스를 사용해야 합니다. 상태 매개변수를 반환하는 호출 이스케이프 시퀀스의 구문은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
{[?=]호출 프로시저 이름[([매개변수][,[매개변수]]...)]}
호출 이스케이프 시퀀스를 구성할 때 ?(물음표) 문자를 사용하여 반환 상태 매개변수를 지정합니다. 이 문자는 이 저장 프로시저에서 반환될 매개변수 값에 대한 자리 표시자 역할을 합니다. 반환 상태 매개 변수의 값을 지정하려면 저장 프로시저를 실행하기 전에 SQLServerCallableStatement 클래스의 RegisterOutParameter 메서드를 사용하여 매개 변수의 데이터 형식을 지정해야 합니다.
또한 반환 상태 매개 변수 값을 RegisterOutParameter 메서드에 전달할 때 사용할 매개 변수의 데이터 형식뿐만 아니라 저장 프로시저에서 매개 변수의 순서 위치도 지정해야 합니다. 반환 상태 매개변수의 순서 위치는 저장 프로시저가 호출될 때 항상 첫 번째 매개변수이기 때문에 항상 1입니다. SQLServerCallableStatement 클래스는 매개 변수 이름을 사용하여 특정 매개 변수를 나타내는 것을 지원하지만 반환 상태 매개 변수에는 매개 변수의 순서 위치 번호만 사용할 수 있습니다.
예를 들어 SQL Server 2005 AdventureWorks 샘플 데이터베이스에서 다음 저장 프로시저를 만듭니다.
다음과 같이 코드 코드를 복사합니다.
절차 만들기 CheckContactCity
(@cityName CHAR(50))
처럼
시작하다
IF ((선택 개수(*)
FROM 사람.주소
WHERE 도시 = @cityName) > 1)
반환 1
또 다른
0을 반환
끝
저장 프로시저는 cityName 매개 변수로 지정된 도시를 Person.Address 테이블에서 찾을 수 있는지 여부에 따라 상태 값 1 또는 0을 반환합니다.
다음 예에서는 이 함수에 AdventureWorks 샘플 데이터베이스에 대한 개방형 연결이 전달된 다음 실행 메서드를 사용하여 CheckContactCity 저장 프로시저가 호출됩니다.
다음과 같이 코드 코드를 복사합니다.
public static void excuteStoredProcedure(Connection con) ...{
노력하다...{
CallableStatement cstmt = con.prepareCall("{? = dbo.CheckContactCity(?)}");
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "애틀랜타");
cstmt.execute();
System.out.println("반환 상태: " + cstmt.getInt(1));
}
cstmt.close();
catch (예외 e) ...{
e.printStackTrace();
}
}
5. 업데이트 횟수가 포함된 저장 프로시저 사용
SQLServerCallableStatement 클래스를 사용하여 저장 프로시저에 대한 호출을 생성한 후에는 Execute 또는 ExecUpdate 메서드를 사용하여 저장 프로시저를 호출할 수 있습니다. ExecuteUpdate 메소드는 이 저장 프로시저의 영향을 받은 행 수를 포함하는 int 값을 반환하지만, Execute 메소드는 이 값을 반환하지 않습니다. 실행 메소드를 사용하고 영향을 받은 행 수를 얻으려면 저장 프로시저를 실행한 후 getUpdateCount 메소드를 호출할 수 있습니다.
예를 들어 SQL Server 2005 AdventureWorks 샘플 데이터베이스에서 다음 테이블과 저장 프로시저를 만듭니다.
다음과 같이 코드 코드를 복사합니다.
테이블 만들기 테스트 테이블
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
절차 UpdateTestTable 생성
@Col2 varchar(50),
@Col3 정수
처럼
시작하다
업데이트 테스트 테이블
SET Col2 = @Col2, Col3 = @Col3
끝;
다음 예에서 이 함수는 AdventureWorks 샘플 데이터베이스에 대한 개방형 연결을 전달하고, 실행 메서드를 사용하여 UpdateTestTable 저장 프로시저를 호출한 다음 getUpdateCount 메서드를 사용하여 저장 프로시저의 영향을 받은 행 수를 반환합니다.
다음과 같이 코드 코드를 복사합니다.
public static void excuteUpdateStoredProcedure(Connection con) ...{
노력하다...{
CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
cstmt.setString(1, "A");
cstmt.setInt(2, 100);
cstmt.execute();
int count = cstmt.getUpdateCount();
cstmt.close();
System.out.println("영향을 받은 행: " + 개수);
}
catch (예외 e) ...{
e.printStackTrace();