有返回值的存储过程(列表 结果集)
案例:编写一个过程,输入部门编号,返回该部门所有员工的信息。对该题的分析如下:
由于oracle的存储过程没有返回值,它的所有返回值都是通过out参数来代替的,,列表同样也不例外,但是由于是集合,所以不能用一般的参数,必须要用package,所以分两部分:
1)建一个包。如下:
create or replace package testpackage as type test_cursor
is ref cursor;
end testpackage;
在该包中我定义了一个游标类型 test_cursor
下面就是写创建过程了
create or replace procedure chenchuang_pro
(chenno in number p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp wheredeptno-chenno;
end;
---------------------------------------------------------
要求,编写一个存储过程,要求可以输入表名,每页显示记录数,当前页,返回总记录数,总页数,和返回结果集。(也就是写一个
分页的存储过程)
oracle 的分页:
在分页的时候,把下面的sql语句当作模板使用
select * from (select t1.* , rownum rn from (select * from
emp)t1 where rn=6
--开始编写分页的过程
先写一个包
create or replace package testpackage as type test_cursor
is ref cursor;
end testpackage;
created or replace procedure fenye
(tablename in varchar2,
pagesize in number;--每页显示的数据量
pagenow in number;--当前的页码
myrows out number;--总记录数
mypagecount out number;--中页数
p_cursor out testpackage.test_cursor-- 返回的记录集
) is
-- 定义部分
---定义sql语句
v_sql varchar2(1000);
v_begin number:=(pagenow-1)*pagesize+1;--分页算法
v_end number :=pagenow*pagesize;
begin
--执行部分
v_sql:='select * from (select t1.* , rownum rn from (select * from '|| tablename||')t1 where rn='||v_begin;
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows 和myjpagecount
--组织一个sql
v_sql:='select count(*) from '|| tablename
--执行sql,并把返回值 赋给myrows
excute immediate v_sql into myrows;
--计算mypagecount
if mod (myrows,pagesize )=0 then
mypagecount:=myrows/pagesize;
else mypagecount:=myrows/pagesize+1;
end if ;
--关闭游标
close p_cursor;
end
