CallableStatement 인터페이스는 저장 프로시저를 실행하는 메서드를 제공합니다. JDBC API는 저장 프로시저 SQL 이스케이프 구문을 제공하므로 단일 표준 방식으로 모든 RDBMS의 저장 프로시저를 호출할 수 있습니다.
CallableStatement 생성
CallableStatement의 개체를 만들 수 있습니다. (인터페이스) prepareCall() 사용 연결 방법 상호 작용. 이 메서드는 쿼리를 나타내는 문자열 변수를 받아 저장 프로시저를 호출하고 CallableStatement를 반환합니다. 개체.
Callable 문은 입력 매개변수, 출력 매개변수 또는 둘 다를 가질 수 있습니다. 프로시저 호출에 입력 매개변수를 전달하려면 자리 표시자를 사용하고 CallableStatement 인터페이스에서 제공하는 setter 메서드(setInt(), setString(), setFloat())를 사용하여 값을 설정할 수 있습니다.
데이터베이스에 myProcedure라는 프로시저 이름이 있다고 가정하고 호출 가능한 명령문을 다음과 같이 준비할 수 있습니다.
//Preparing a CallableStatement CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");
입력 매개변수에 값 설정
setter 메소드를 사용하여 프로시저 호출의 입력 매개변수에 값을 설정할 수 있습니다.
이것은 두 개의 인수를 허용합니다. 하나는 입력 매개변수의 배치 인덱스를 나타내는 정수 값이고, 다른 하나는 int 또는, String 또는, float 등... 프로시저에 asinput 매개변수를 전달하는 데 필요한 값을 나타냅니다.
참고: 인덱스 대신 문자열 형식의 매개변수 이름을 전달할 수도 있습니다.
cstmt.setString(1, "Raghav"); cstmt.setInt(2, 3000); cstmt.setString(3, "Hyderabad");
호출 가능 명령문 실행
CallableStatement 객체를 생성하면 execute() 중 하나를 사용하여 실행할 수 있습니다. 방법.
cstmt.execute();
예시
Employee라는 테이블이 있다고 가정합니다. 다음 데이터가 있는 MySQL 데이터베이스:
+---------+--------+----------------+ | Name | Salary | Location | +---------+--------+----------------+ | Amit | 30000 | Hyderabad | | Kalyan | 40000 | Vishakhapatnam | | Renuka | 50000 | Delhi | | Archana | 15000 | Mumbai | +---------+--------+----------------+
그리고 아래와 같이 이 테이블에 값을 삽입하기 위해 myProcedure라는 프로시저를 만들었습니다.
Create procedure myProcedure (IN name VARCHAR(30), IN sal INT, IN loc VARCHAR(45)) -> BEGIN -> INSERT INTO Employee(Name, Salary, Location) VALUES (name, sal, loc); -> END //
다음은 호출 가능한 문을 사용하여 위에서 생성한 프로시저를 호출하여 Employee 테이블에 새 레코드를 삽입하는 JDBC 예제입니다.
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class CallableStatementExample { public static void main(String args[]) throws SQLException { //Registering the Driver DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //Getting the connection String mysqlUrl = "jdbc:mysql://localhost/testdb"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("Connection established......"); //Preparing a CallableStateement CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}"); cstmt.setString(1, "Raghav"); cstmt.setInt(2, 3000); cstmt.setString(3, "Hyderabad"); cstmt.setString(1, "Kalyan"); cstmt.setInt(2, 4000); cstmt.setString(3, "Vishakhapatnam"); cstmt.setString(1, "Rukmini"); cstmt.setInt(2, 5000); cstmt.setString(3, "Delhi"); cstmt.setString(1, "Archana"); cstmt.setInt(2, 15000); cstmt.setString(3, "Mumbai"); cstmt.execute(); System.out.println("Rows inserted ...."); } }
출력
Connection established...... Rows inserted ....
select 쿼리를 사용하여 Employee 테이블의 내용을 검색하면 아래와 같이 새로 추가된 레코드를 확인할 수 있습니다.
mysql> select * from employee; +---------+--------+----------------+ | Name | Salary | Location | +---------+--------+----------------+ | Amit | 30000 | Hyderabad | | Kalyan | 40000 | Vishakhapatnam | | Renuka | 50000 | Delhi | | Archana | 15000 | Mumbai | | Raghav | 3000 | Hyderabad | | Raghav | 3000 | Hyderabad | | Kalyan | 4000 | Vishakhapatnam | | Rukmini | 5000 | Delhi | | Archana | 15000 | Mumbai | +---------+--------+----------------+ 9 rows in set (0.00 sec)