首先引用百度的解释,数据库的存储过程是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
Oracle存储过程基本语法:
CREATE OR REPLACE PROCEDURE 存储过程名
IS
BEGIN
NULL;
END;
1.存储过程的优点
一 在数据库中保存的存储过程语句都是编译过的
二允许模块化程序设计-类似方法复用
三提高系统安全性-防止sql注入
四减少网络流通量-只要传输过程名称
五数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装与数据库提供的事物处理结合一起使用
系统存储过程一般以sp开头,用户自定义的储存过程一般以usp开头
2.定义存储过程的语法,“[”里面的内容表示可选项
create proc 存储过程名
@参数1 数据类型【=默认值】【output】,
....
as sql语句
3.简单的一个例子
定义存储过程:
create or replace procedure sp_pro3(v_ename varchar2, v_sal number) is
begin
select name,id into v_ename,v_sal from test where id=&a;
dbms_output.put_line('是:'||v_ename||'id是:'||v_sal);
exception
when no_data_found then
dbms_output.put_line('输入有误');
end;
执行存储过程:
Situation One(调用默认的参数)
exec usp_StudentByGenderAge
Situation Two(调用自己指定的参数)
exec usp_StudentByGenderAge '女',50
或者指定变量 exec usp_StudentByGenderAge @age=50,@gender='女'
对存储过程进行修改
alter proc usp_StudentByGenderAge
@gender nvarchar(10)[='男'],
@age int[=30],
--加output表示该参数是需要在存储过程中赋值并返回的
@recorderCount int output
as
select * from MyStudent where FGender=@gender and FAge=@age
set @recorderCount=(select count(*) from MyStudent where FGender=@gender and FAge=@age)
--output参数的母的,就是调用者需要传递一个变量进来,然后在存储过程中为该变量完成赋值工作,存储过程执行完成以后,将
执行的对应结果返回给传递进来的变量。
调用
因为该存储过程前面还有其他参数,所以要把@recorderCount写上,该存储过程执行后,相当与完成了以上的查询工作,
同时将查询结果得到的条数赋值给了@count变量。(@count是当做参数传给usp_StudentByGenderAge,当存储过程执行完毕
以后,将得到的条数返回给@count)
declare @count int
exec usp_StudentByGenderAge @recorderCount=@count output
print @count
4.用存储过程完成分页
一,存储过程代码
create proc usp_page
@page int,--一页显示多少条记录
@number int,--用户选择了第几页数据
as
begin
select * from
--小括号里面内容是专门得到排列的序号
(
select Row_number() over(order by(Fid)) as number
from MyStudent
) as t
where t.number>=(@number-1)*@page+1 and t.number<=@number*@page end
用hibernate调用存储过程
Connection con = session.connect();
CallableStatement proc = null;
con = connectionPool.getConnection();
proc = con.prepareCall("{ call set_death_age(?, ?) }");
proc.setString(1, XXX);
proc.setInt(2, XXx);
...
proc.execute();
session.close();
Session session = HibernateUtil.currentSession();
Query query = session.getNamedQuery("selectAllUsers");
List list = query.list();
System.out.println(list);