结束块:由end关键字结果。 1.2 存储过程的参数传递方式
存储过程的参数传递有三种方式:IN,OUT,IN OUT .
IN 按值传递,并且它不允许在存储过程中被重新赋值。如果存储过程的参数没有指定存参数传递类型,默认为IN
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(20);
begin
p_para1 :='aaa';
p_para2 :='bbb';
v_name := '张三丰';
p_para3 := v_name;
dbms_output.put_line('p_para3:'||p_para3);
null;
end;
Warning: Procedure created with compilation errors
SQL> show error;
Errors for PROCEDURE LIFEMAN.PROC1:
LINE/COL ERROR
-------- ----------------------------------------------------------------------
8/3 PLS-00363: expression 'P_PARA1' cannot be used as an assignment target
8/3 PL/SQL: Statement ignored
这一点与其它高级语言都不同。它相当于java在参数前面加上final关键字。
OUT 参数:作为输出参数,需要注意,当一个参数被指定为OUT类型时,就算在调用存储过程之前对该参数进行了赋值,在存储过程中该参数的值仍然是null.
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(20);
begin
v_name := '张三丰';
p_para3 := v_name;
dbms_output.put_line('p_para1:'||p_para1);
dbms_output.put_line('p_para2:'||p_para2);
dbms_output.put_line('p_para3:'||p_para3);
end;
SQL> var p1 varchar2(10);
SQL> var p2 varchar2(10);
SQL> var p3 varchar2(10);
SQL> exec :p1 :='aaaa';
SQL> exec :p2 :='bbbb';
SQL> exec :p3 :='cccc';
SQL> exec proc1(:p1,:p2,:p3);
p_para1:aaaa
p_para2:
p_para3:张三丰
SQL> exec dbms_output.put_line(:p2);
PL/SQL procedure successfully completed
p2
---------
INOUT 是真正的按引用传递参数。即可作为传入参数也可以作为传出参数。 1.3 存储过程参数宽度
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(2);
begin
v_name := p_para1;
end;
SQL> var p1 varchar2(10);
SQL> var p2 varchar2(20);
SQL> var p3 varchar2(30);
SQL> exec :p1 :='aaaaaa';
SQL> exec proc1(:p1,:p2,:p3);
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "LIFEMAN.PROC1", line 8
ORA-06512: at line 1
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(2);
begin
p_para2 :='aaaaaaaaaaaaaaaaaaaa';
end;
SQL> var p1 varchar2(1);
SQL> var p2 varchar2(1);
SQL> var p3 varchar2(1);
SQL> exec :p2 :='a';
SQL> exec proc1(:p1,:p2,:p3);
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(2);
begin
p_para3 :='aaaaaaaaaaaaaaaaaaaa';
end;
SQL> var p1 varchar2(1);
SQL> var p2 varchar2(1);
SQL> var p3 varchar2(1);
SQL> exec proc1(:p1,:p2,:p3);
执行这个过程,仍然正确执行。
可见,对于IN参数,其宽度是由外部决定。
对于OUT 和IN OUT 参数,其宽度是由存储过程内部决定。
因此,在写存储过程时,对参数的宽度进行说明是非常有必要的,最明智的方法就是参数的数据类型使用%type。这样双方就达成了一致。 1.3 参数的默认值
存储过程的参数可以设置默认值
create or replace procedure procdefault(p1 varchar2,
p2 varchar2 default 'mark')
as
begin
dbms_output.put_line(p2);
end;
SQL> set serveroutput on;
SQL> exec procdefault('a');
mark
可以通过default 关键字为存储过程的参数指定默认值。在对存储过程调用时,就可以省略默认值。
需要注意的是:默认值仅仅支持IN传输类型的参数。OUT 和 IN OUT不能指定默认值
对于有默认值的参数不是排在最后的情况。
create or replace procedure procdefault2(p1 varchar2 default 'remark',
p2 varchar2 )
as
begin
dbms_output.put_line(p1);
end;