存储过程的参数有三种模式:
in(默认的参数模式,用来接收调用程序的值)
out(用来向调用程序返回值)
in out(用于接收调用程序的值,并向调用程序返回更新的值)
以下用一个小例子为例:
假设有一张用户表user_info,里面有字段userid,username,age,写一个存储过程,根据userid查询用户名
1、创建存储过程:
只有一个默认参数:
create or replace procedure p_test(user_id in number)
-------------------- 声明变量部分
is
user_name userinfo.username%type;
-------------------- 可执行部分
begin
select username into user_name from userinfo where userid = user_id;
dbms_output.put_line('用户名为:'||user_name);
-------------------- 异常部分
exception
when others then
dbms_output.put_line('查询不到该用户');
end;
存储过程中变量后面跟%type(例如user_name userinfo.username%type;)的意思:user_name是自己自定义的变量,userinfo是数据库中存在的一张表,username是表中的一个字段,然后%type就是username的数据类型,其实就是让user_name这个变量的数据类型与数据库里面的表字段类型匹配,从而不必担心类型不匹配的问题。
用%type的好处:
(1)所引用的数据库中列的个数和数据类型可以不必知道
(2)所引用的数据库中列的个数和数据类型可以实时改变
既有输入参数,又有输出参数:
create or replace procedure p_test(user_id in number,user_name out varchar2)
is
begin
select username into user_name from userinfo where userid = user_id;
exception
when others then
dbms_output.put_line('查询不到该用户');
end;
此时应该如下调用:
declare
user_name varchar2(50)
begin
userId:=1
p_test(1,user_name);
end;
in out 参数例子:
create or replace procedure p_test(user_id in number,user_name in out varchar2,user_age out number)
is
begin
select username,age into user_name,user_age from userinfo where userid = user_id and username = user_name;
exception
when others then
dbms_output.put_line('查询不到该用户');
end;
此时应该如下调用:
declare
v_username varchar2(50);
v_userage number;
begin
v_userid:=1;
p_test(v_userid,v_username,v_userage);
end;
2、执行存储过程
第一种方法:call p_test(1);
第二种方法:
declare
begin
p_test(1);
end;
第三种方法:在命令行中执行
execute p_test(1);
不过执行之前注意打开命令行输出提示:set serveroutput on;
3、将过程的执行权限授予其他用户
grant execute on proc_name to user_name;
4、删除存储过程
drop procedure proc_name;