带有输入输出的存储过程
首先来创建一个表,执行脚本如下脚本:
--删除表
drop table book;
--创建表book
create table book (bid number,bname varchar2(50),bhouse varchar2(50));
--插入数据
insert into book(bid,bname,bhouse) values(1,'笑傲江湖','人民出版社');
insert into book(bid,bname,bhouse) values(2,'钢铁是怎样炼成的','人民出版社');
insert into book(bid,bname,bhouse) values(3,'平凡的世界','人民出版社');
commit;
带有输入输出的过程:
--输入id,返回书名,和出版社名字
create or replace procedure anl1
--使用out表示一个输出参数
(spno in number,spname out book.bname%type,sphouse out book.bhouse%type) is
begin
select bname,bhouse into spname,sphouse from book where bid = spno;
end;
--in 代表输入参数,如果不写,默认为in
--out,表示这是一个输出参数
--调用带有输入输出的过程
declare
a book.bname%type;
b book.bhouse%type;
begin
anl1(1,a,b);
dbms_output.put_line('书名:'||a||'出版社:'||b);
end;
带有游标的过程,既返回的是一个列表【结果集】:
–输入出版社的名字,返回该出版社书籍的所有信息
分析:由于oracle过程没有返回值,他所有的返回值都是通过out参数来代替,但是由于该案例需要输出的信息是一个集合,所以不能用一般的参数,需要使用包(package)
--1、建立一个包,定义一个游标
create or replace package sp_package as
type sp_cursor is ref cursor;
end sp_package;
--2、创建过程,输出类型是一个游标
create or replace procedure anl1
--定义游标类输出类型:参数名 out 创建的包名.包内的游标名;
(sphouse in book.bhouse%type,sp_test out sp_package.sp_cursor) is
begin
open sp_test for select * from book where bhouse = sphouse;
end;
--最后调用过程(在SQL中)
declare
--定义过程输入参数变量
a book.bhouse%type:= '人民出版社';
--定义游标变量(包内的需要加上包名)
b sp_package.sp_cursor;
--定义输出变量
c book.bid%type;
d book.bname%type;
e book.bhouse%type;
begin
--调用过程
anl1(a,b);
loop
--赋值,将游标变量获取到的内容一一赋值给输出变量c,d,e
fetch b into c,d,e;
--判断aa是否为空
exit when b%notfound;
dbms_output.put_line('id:'||c||'name:'||d||'house:'||e);
end loop;
end;