–1
–创建存储过程,包括3部分,声明,执行,异常处理
创建存储过程不需要使用declare关键字,而是使用create
or replace关键字
in模式参数
create or replace procedure pro_insertdept is
begin
insert into dept values(77,'市场拓展部','jilin');
commit;
dbms_output.put_line('插入成功!');
end;
/
–out:输出类型的参数
create or replace procedure select_dept(
num_deptno in number,
var_dname out dept.dname%type,
var_loc out dept.loc%type
)is
begin
select dname,loc into var_dname,var_loc
from dept
where deptno=num_deptno;
expection
when no_data_found then
dbms_output.put_line('666');
end select_dept;
/
–【1】使用pl/sql块调用out模式的存储过程
set serverout on;
declare
var_dname dept.dname%type;
var_loc dept.loc%type;
begin
select_dept(99,var_dname,var_loc);
dbms_output.put_line(var_dname||var_loc);
end;
/
–【2】使用exec命令执行out模式的存储过程
–需要用variable关键字声明两个变量,用以存储out参数
variable var_dname varchar2(50);
variable var_loc varchar2(50);
exec select_dept(15,:var_dname,:var_loc);
–此时看不到值,可用print命令打印输出值
print var_dname var_loc;
–使用select语句输出
select :var_dname,:var_loc
from dual;
若声明了out模式的参数,则在执行存储过程时,
必须为out参数提供变量,以便接收out参数的返回值
否则,程序执行后将会出现错误。
–in out模式
create or replace procedure pro_square(
num in out number,
flag in boolean)is
i int:=2;
begin
if flag then
num:=power(num,i);
else
num:=sqrt(num);
end if;
end;
/
–调用存储过程pro_square
set serverout on;
declare
var_number in number;
var_temp number;
boo_flag boolean;
begin
var_temp:=3;
var_number:=var_temp;
boo_flag:=false;
pro_square(var_number,boo_flag);
if boo_flag then
dbms_output.put_line(var_temp||'的平方为:'||var_number);
else
dbms_output.put_line(var_temp||'平方根为:'||var_number);
end if;
end;
/
in参数的默认值
create or replace procedure insert_dept(
num_deptno in number,
var_dname in varchar2 default '综合楼',
var_loc in varchar2 default '北京')is
begin
insert into dept values(num_deptno,var_dname,var_loc);
end;
/
–调用该存储过程
declare
row_dept dept%rowtype;
begin
insert_dept(57,var_loc=>'太远');
commit;
select * into row_dept from dept where deptno=57;
dbms_output.put_line('');
end;
/