1.基本语法
DELIMITER 定义了一个语句执行的结束符,默认情况下,delimiter是分号;
delimiter $$
创建无参存储过程
CREATE PROCEDURE pro1() BEGIN SELECT * FROM userTest; END; $$
删除存储过程
DROP PROCEDURE pro1;
调用存储过程
call pro1(); $$
创建一个带输入参数的存储过程
CREATE PROCEDURE pro2(in a int) BEGIN SELECT * from usertest where userId=a; END; -- 调用 call pro2(100);
创建一个运算的存储过程
CREATE PROCEDURE pro3(in a int,in b int) BEGIN select a+b; END; -- 调用 call pro3(3,7);
创建带输出参数的存储过程
CREATE PROCEDURE pro4(in a int,out b VARCHAR(20)) BEGIN select userName INTO b from usertest where userId=a; END; -- 调用 call pro4(100,@name) -- 查看name的值 select @name;
创建带多个输出参数的存储过程
CREATE PROCEDURE pro5(in a int,out b VARCHAR(20),out c int) BEGIN SELECT userName,userPassword INTO b,c from usertest where userId=a; END;
删除存储过程
DROP PROCEDURE pro5;
调用
call pro5(200,@user,@pass); SELECT @user,@pass;
2.程序中调用存储过程
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
public class ProcedureTest {
//执行不带返回值的存储过程没有任何意义
@Test
public void procedureTest() throws SQLException
{
//获得连接对象
Connection conn=JdbcUtils.getConnection();
//创建执行存储过程的命令对象
CallableStatement cstmt=conn.prepareCall("{call pro2(?)}");
//指定?的值
cstmt.setInt(1, 300);
//执行存储过程
cstmt.executeUpdate();
//释放资源
JdbcUtils.release(null, cstmt, conn);
}
//执行带返回值的存储过程
@Test
public void procedureDemo() throws SQLException
{
//获得连接对象
Connection conn=JdbcUtils.getConnection();
//创建执行存储过程的命令对象
CallableStatement cstmt=conn.prepareCall("{call pro4(?,?)}");
//指定?的值
cstmt.setInt(1, 300);
//指定第二个?为输出参数
cstmt.registerOutParameter(2,Types.VARCHAR);
//执行存储过程
cstmt.executeUpdate();
//获得返回值
String name=cstmt.getString(2);
System.out.println(name);
//释放资源
JdbcUtils.release(null, cstmt, conn);
}
}
注:以上操作基于MySQL数据库