CallableStatement इंटरफेस स्टोर्ड प्रोसीजर एक्जीक्यूट करने के लिए मेथड्स प्रदान करता है। चूंकि JDBC API एक स्टोर्ड प्रोसीजर SQL एस्केप सिंटैक्स प्रदान करता है, आप सभी RDBMS के स्टोर्ड प्रोसीजर को एक ही मानक तरीके से कॉल कर सकते हैं।
CallableStatement बनाना
आप Connection इंटरफेस के prepareCall() मेथड का उपयोग करके CallableStatement (इंटरफेस) का ऑब्जेक्ट बना सकते हैं। यह मेथड स्टोर्ड प्रोसीजर को कॉल करने वाली क्वेरी को दर्शाने वाला एक स्ट्रिंग वेरिएबल स्वीकार करता है और एक CallableStatement ऑब्जेक्ट लौटाता है।
एक कॉल करने योग्य स्टेटमेंट में इनपुट पैरामीटर्स, आउटपुट पैरामीटर्स या दोनों हो सकते हैं। प्रोसीजर कॉल में इनपुट पैरामीटर्स पास करने के लिए आप प्लेसहोल्डर का उपयोग कर सकते हैं और CallableStatement इंटरफेस द्वारा प्रदान किए गए सेटर मेथड्स (setInt(), setString(), setFloat()) का उपयोग करके इनमें वैल्यू सेट कर सकते हैं।
मान लीजिए आपके डेटाबेस में myProcedure नाम की एक प्रोसीजर है, तो आप कॉल करने योग्य स्टेटमेंट को इस तरह तैयार कर सकते हैं:
// CallableStatement तैयार करना
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");
इनपुट पैरामीटर्स में वैल्यू सेट करना
आप सेटर मेथड्स का उपयोग करके प्रोसीजर कॉल के इनपुट पैरामीटर्स में वैल्यू सेट कर सकते हैं।
ये दो आर्गुमेंट्स स्वीकार करते हैं, एक इनपुट पैरामीटर के प्लेसमेंट इंडेक्स को दर्शाने वाला इंटीजर वैल्यू है और दूसरा वह int, String, float आदि है जिसे आप प्रोसीजर में इनपुट पैरामीटर के रूप में पास करना चाहते हैं।
नोट: इंडेक्स के बजाय आप पैरामीटर का नाम String फॉर्मेट में भी पास कर सकते हैं।
cstmt.setString(1, "Raghav"); cstmt.setInt(2, 3000); cstmt.setString(3, "Hyderabad");
Callable Statement एक्जीक्यूट करना
एक बार CallableStatement ऑब्जेक्ट बनाने के बाद, आप इसे execute() मेथड में से किसी एक का उपयोग करके एक्जीक्यूट कर सकते हैं।
cstmt.execute();
उदाहरण
मान लीजिए हमारे पास MySQL डेटाबेस में Employee नाम की एक टेबल है जिसमें निम्नलिखित डेटा है:
+---------+--------+----------------+ | 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 //
निम्नलिखित JDBC उदाहरण उपरोक्त बनाई गई प्रोसीजर को कॉल करके, कॉल करने योग्य स्टेटमेंट का उपयोग करके Employee टेबल में नए रिकॉर्ड इन्सर्ट करता है।
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 {
// ड्राइवर रजिस्टर करना
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// कनेक्शन प्राप्त करना
String mysqlUrl = "jdbc:mysql://localhost/testdb";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// CallableStatement तैयार करना
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)