刚接触存储过程的小伙伴可能有点懵,个人是把它当作Java中的方法(或C++中的函数)来理解;
一个存储过程可以封装多个SQL语句和控制语句,实现较为复杂的功能;
但在Java中只需要“调用”它的存储过程名,并传入相应参数即可;
以下以向购物车表中添加一行新数据为例
1、购物车表结构:
2、存储过程
可编程性–>存储过程–>右击–>添加存储过程
USE [SYMall] //use [数据库名]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE AddCart //新建 存储过程 名称
@cid nchar(10), //参数名
@gid int,
@gnum int,
@msg nchar(7) output //输出参数+output
AS
if exists(select * from Goods where id=@gid)
BEGIN
SET NOCOUNT ON;
if (select storage from Goods where id=@gid)<>0
declare @name nchar(10),@price float,@type nchar(10)
select @name=name,@price=price,@type=type from Goods where id=@gid
if not exists(select * from Cart where gid=@gid)
insert into Cart(cid,gid,gname,gprice,gtype,gnum) values(@cid,@gid,@name,@price,@type,@gnum)
else
update Cart set gnum=gnum+@gnum where cid=@cid and gid=@gid
set @msg='success'
END
else
set @msg='unexist'
3、Java调用
public class AddCartDao extends ConnectQSL{
public String addCart(String id,String gid,String num){
ConnectionSql();
String result=null;
try {
String sql="{call AddCart(?,?,?,?)}"; //格式"{call 存储过程名(参数列表)}"
CallableStatement stat=conn.prepareCall(sql);
stat.setString(1, id); //传入参数
stat.setString(2, gid);
stat.setString(3, num);
stat.registerOutParameter(4, java.sql.Types.NCHAR); //输出参数
stat.execute();
result=stat.getString(4);
System.out.println("result"+result);
} catch (SQLException e) {
e.printStackTrace();
}
if(result.equals("unexist")){
return "unexist";
}
return "success";
}
}