答:存储过程是子例程,是SQL语句的一部分,存储在SQL目录中。所有可以访问关系数据库的应用程序(Java,Python,PHP等)都可以访问存储过程。
存储过程包含IN和OUT参数或两者。如果您使用SELECT语句,它们可能会返回结果集。存储过程可以返回多个结果集。
您可以使用以下语法调用存储过程:
CALL procedure_name (input_parameter1, input_parameter2, input_parameter3)
JDBC提供了标准的存储过程SQL转义语法,您可以使用该语法在所有RDBMS中进行过程
要使用JDBC程序调用存储过程,您需要:
使用DriverManager类的registerDriver()方法注册driver:类。将驱动程序类名称作为参数传递给它。
建立连接:使用DriverManager类的getConnection()方法连接数据库。将URL(字符串),用户名(字符串),密码(字符串)作为参数传递给它。
Create Statement:使用Connection接口的prepareCall()
方法创建CallableStatement对象。
执行查询:使用execute()
Statement接口的方法执行查询。
假设我们在数据库中有一个名为customers的表,其内容如下:
+----+-----------+-----+---------+----------------+ | ID | NAME | AGE | SALARY | ADDRESS | +----+-----------+-----+---------+----------------+ | 1 | Amit | 25 | 3000.00 | Hyderabad | | 2 | Kalyan | 27 | 4000.00 | Vishakhapatnam | | 3 | Renuka | 30 | 5000.00 | Delhi | | 4 | Archana | 24 | 1500.00 | Delhi | | 5 | Koushik | 30 | 9000.00 | Delhi | | 6 | Hardik | 45 | 6400.00 | Delhi | +----+-----------+-----+---------+----------------+
我们已经在数据库中创建了一个名为insertData的存储过程,如下所示:
mysql> DELIMITER //; mysql> Create procedure insertData( IN c_id INT, IN c_name VARCHAR(255), IN c_age INT, IN c_sal INT, IN c_add VARCHAR(255)) BEGIN INSERT INTO CUSTOMERS VALUES (c_id, c_name, c_age, c_sal, c_add); END// mysql> DELIMITER ;
此过程接受ID(整数),名称(字符串),年龄(整数),工资(整数)和地址(字符串)作为IN参数,并在客户表中插入新记录。
以下JDBC程序建立与MySQL数据库的连接,并使用名为insertData的过程在客户表中插入6条记录。
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class CallngStoredProcedureExample_IN { public static void main(String args[]) throws SQLException { //注册驱动程序 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //获得连接 String mysqlUrl = "jdbc:mysql://localhost/mydatabase"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("Connection established......"); //准备一个CallableStatement来调用过程 CallableStatement cstmt = con.prepareCall("{call insertData(?, ?, ?, ?, ?)}"); //设置过程的IN参数的值 cstmt.setInt(1, 7); cstmt.setString(2, "Trupthi"); cstmt.setInt(3, 33); cstmt.setInt(4, 4360); cstmt.setString(5, "Ahmedabad"); cstmt.execute(); cstmt.setInt(1, 8); cstmt.setString(2, "Mithili"); cstmt.setInt(3, 26); cstmt.setInt(4, 4100); cstmt.setString(5, "Vijayawada"); cstmt.execute(); cstmt.setInt(1, 9); cstmt.setString(2, "Maneesh"); cstmt.setInt(3, 39); cstmt.setInt(4, 4000); cstmt.setString(5, "Hyderabad"); cstmt.execute(); cstmt.setInt(1, 10); cstmt.setString(2, "Rajaneesh"); cstmt.setInt(3, 30); cstmt.setInt(4, 6400); cstmt.setString(5, "Delhi"); cstmt.execute(); cstmt.setInt(1, 11); cstmt.setString(2, "Komal"); cstmt.setInt(3, 29); cstmt.setInt(4, 8000); cstmt.setString(5, "Ahmedabad"); cstmt.execute(); cstmt.setInt(1, 12); cstmt.setString(2, "Manyata"); cstmt.setInt(3, 25); cstmt.setInt(4, 5000); cstmt.setString(5, "Vijayawada"); cstmt.execute(); System.out.println("Procedure called by passing required values......"); } }
输出结果
Connection established...... Procedure called by passing required values......
如果使用select命令检索customers表的内容,则可以观察到新添加的记录,如下所示:
mysql> select * from customers; +----+-----------+-----+---------+----------------+ | ID | NAME | AGE | SALARY | ADDRESS | +----+-----------+-----+---------+----------------+ | 1 | Amit | 25 | 3000.00 | Hyderabad | | 2 | Kalyan | 27 | 4000.00 | Vishakhapatnam | | 3 | Renuka | 30 | 5000.00 | Delhi | | 4 | Archana | 24 | 1500.00 | Delhi | | 5 | Koushik | 30 | 9000.00 | Delhi | | 6 | Hardik | 45 | 6400.00 | Delhi | | 7 | Trupthi | 33 | 4360.00 | Ahmedabad | | 8 | Mithili | 26 | 4100.00 | Vijayawada | | 9 | Maneesh | 39 | 4000.00 | Hyderabad | | 10 | Rajaneesh | 30 | 6400.00 | Delhi | | 11 | Komal | 29 | 8000.00 | Ahmedabad | | 12 | Manyata | 25 | 5000.00 | Vijayawada | +----+-----------+-----+---------+----------------+ 12 rows in set (0.00 sec)