CallableStatement: Executing Stored Procedures with IN, OUT, INOUT Parameters
CallableStatement: Executing Stored Procedures with IN, OUT, INOUT Parameters
CallableStatement in JDBC
जब हम JDBC (Java Database Connectivity) के साथ काम करते हैं, तो हमें अक्सर Database में मौजूद Stored Procedures को execute करने की जरूरत पड़ती है। ऐसे cases में हम CallableStatement interface का use करते हैं। यह java.sql package का हिस्सा है और Stored Procedure को call करने के लिए specially बनाया गया है।
Stored Procedure क्या होता है?
Stored Procedure एक predefined SQL program होता है जो database में store रहता है और जिसे हम बार-बार execute कर सकते हैं। इसमें SQL statements, conditions और logic एक जगह पर होते हैं। उदाहरण के लिए, अगर हमें बार-बार किसी employee की salary update करनी है, तो हर बार SQL query लिखने की जगह हम एक Stored Procedure बना सकते हैं।
CallableStatement का Introduction
CallableStatement एक interface है जो PreparedStatement को extend करता है। इसका use Stored Procedures को call करने के लिए होता है।
इसमें हम IN, OUT और INOUT parameters पास कर सकते हैं।
CallableStatement object को हम Connection interface की prepareCall() method से प्राप्त करते हैं।
CallableStatement cstmt = con.prepareCall("{call procedure_name(?, ?, ?)}");
Syntax of CallableStatement
CallableStatement का general syntax इस प्रकार होता है:
{call procedure_name(?, ?, ?)}
यहाँ ? placeholders होते हैं जो procedure के parameters को represent करते हैं। इन parameters को हम setXXX() और registerOutParameter() methods से handle करते हैं।
Types of Parameters in CallableStatement
Stored Procedure में parameters तीन प्रकार के होते हैं:
- IN parameter: Procedure को data भेजने के लिए।
- OUT parameter: Procedure से data वापस पाने के लिए।
- INOUT parameter: Data भेजने और वापस पाने दोनों के लिए।
Creating a Stored Procedure
आइए एक practical example से समझते हैं कि Stored Procedure कैसे बनाई जाती है। मान लीजिए हमारे पास एक table है — employees(emp_id, emp_name, emp_salary)। अब हम एक procedure बनाएंगे जो employee की salary को update करेगा।
CREATE PROCEDURE updateSalary(IN empId INT, IN newSalary DOUBLE)
BEGIN
UPDATE employees SET emp_salary = newSalary WHERE emp_id = empId;
END;
Executing Stored Procedure with IN Parameter
जब हम procedure को call करते हैं जिसमें केवल IN parameters हों, तो हम values को setXXX() method से set करते हैं।
CallableStatement cstmt = con.prepareCall("{call updateSalary(?, ?)}");
cstmt.setInt(1, 101);
cstmt.setDouble(2, 50000.0);
cstmt.execute();
यह code employee ID 101 की salary को 50000.0 से update करेगा। यहाँ दोनों parameters IN type के हैं।
Executing Stored Procedure with OUT Parameter
अब मान लीजिए हमें किसी employee की salary को database से fetch करना है। इसके लिए हम OUT parameter का use करेंगे।
CREATE PROCEDURE getSalary(IN empId INT, OUT salary DOUBLE)
BEGIN
SELECT emp_salary INTO salary FROM employees WHERE emp_id = empId;
END;
अब Java code से इस procedure को call करने के लिए हम registerOutParameter() का use करेंगे।
CallableStatement cstmt = con.prepareCall("{call getSalary(?, ?)}");
cstmt.setInt(1, 101);
cstmt.registerOutParameter(2, java.sql.Types.DOUBLE);
cstmt.execute();
double sal = cstmt.getDouble(2);
System.out.println("Employee Salary: " + sal);
यहाँ registerOutParameter() method OUT parameter को register करता है ताकि procedure execution के बाद उसका result प्राप्त किया जा सके।
Executing Stored Procedure with INOUT Parameter
INOUT parameter का use तब किया जाता है जब हमें value को input के रूप में भी भेजना हो और output के रूप में भी प्राप्त करना हो।
CREATE PROCEDURE modifySalary(INOUT empSalary DOUBLE)
BEGIN
SET empSalary = empSalary + (empSalary * 0.10);
END;
यह procedure salary को 10% बढ़ा देगा और updated salary return करेगा।
CallableStatement cstmt = con.prepareCall("{call modifySalary(?)}");
cstmt.setDouble(1, 40000.0);
cstmt.registerOutParameter(1, java.sql.Types.DOUBLE);
cstmt.execute();
double newSalary = cstmt.getDouble(1);
System.out.println("Updated Salary: " + newSalary);
यहाँ parameter को पहले input value दी जाती है और execution के बाद वही parameter updated value के साथ return होता है।
Important Methods of CallableStatement
| Method | Description |
|---|---|
setXXX(int paramIndex, value) |
IN parameter के लिए value set करता है। |
registerOutParameter(int paramIndex, int sqlType) |
OUT parameter को register करता है। |
getXXX(int paramIndex) |
OUT parameter की value प्राप्त करता है। |
execute() |
Procedure को execute करता है। |
Advantages of CallableStatement
- Stored Procedures को efficiently execute करता है।
- Code reuse और maintainability बढ़ाता है।
- Database logic को centralized करता है।
- SQL Injection से बचाव करता है क्योंकि parameters precompiled होते हैं।
- Performance better होती है क्योंकि procedure compiled format में stored होता है।
Difference between Statement, PreparedStatement and CallableStatement
| Feature | Statement | PreparedStatement | CallableStatement |
|---|---|---|---|
| Purpose | Static SQL queries execute करना | Dynamic queries execute करना | Stored Procedures execute करना |
| Parameters | Not Supported | Only IN parameters | IN, OUT, INOUT parameters |
| Performance | Low | Better | Best |
| Reusability | Low | High | High |
Example: Executing Stored Procedure with Multiple Parameters
मान लीजिए हमारे पास एक Stored Procedure है जो किसी employee की details insert करता है।
CREATE PROCEDURE insertEmployee(IN empId INT, IN empName VARCHAR(50), IN empSalary DOUBLE)
BEGIN
INSERT INTO employees VALUES(empId, empName, empSalary);
END;
अब Java code से इस procedure को call करेंगे:
CallableStatement cstmt = con.prepareCall("{call insertEmployee(?, ?, ?)}");
cstmt.setInt(1, 103);
cstmt.setString(2, "Aman");
cstmt.setDouble(3, 45000.0);
cstmt.execute();
System.out.println("Employee record inserted successfully!");
Exception Handling in CallableStatement
Stored Procedures execute करते समय exceptions आ सकती हैं जैसे SQLSyntaxError, NullPointerException आदि। इसलिए हमेशा try-catch block का use करें।
try {
CallableStatement cstmt = con.prepareCall("{call getSalary(?, ?)}");
cstmt.setInt(1, 101);
cstmt.registerOutParameter(2, java.sql.Types.DOUBLE);
cstmt.execute();
System.out.println("Salary: " + cstmt.getDouble(2));
} catch (SQLException e) {
e.printStackTrace();
}
Best Practices for Using CallableStatement
- Always close CallableStatement and Connection objects after use।
- Use parameterized calls instead of concatenating SQL strings।
- Handle exceptions properly to avoid resource leaks।
- Stored Procedure logic को database में optimize रखें।
- Use connection pooling for better performance।
Real-life Use Case
बड़ी कंपनियों में जैसे Banking या eCommerce systems में, CallableStatement का use transaction processes के लिए किया जाता है। उदाहरण के लिए, जब किसी user का payment process होता है, तो एक Stored Procedure complete payment transaction handle करती है जिसमें multiple IN और OUT parameters होते हैं जैसे userId, amount, status आदि। CallableStatement इन सब parameters को सुरक्षित और तेज़ तरीके से manage करता है।
Key Points to Remember
- CallableStatement PreparedStatement को extend करता है।
- IN, OUT और INOUT parameters handle कर सकता है।
- Database में stored procedures को call करने के लिए use किया जाता है।
- Performance और security दोनों में बेहतर होता है।
- Always register OUT parameters before execution।