首先,我们要明白,我们无法在存储过程的定义中指定存储参数的宽度,也就
导致了我们无法在存储过程中控制传入变量的宽度。这个宽度是完全由外部传
入时决定的。
我们再来看看 ! 类型的参数的宽度。
代码
createorreplaceprocedureproc1(
* p_para1varchar2,
+ p_para2outvarchar2,
, p_para3inoutvarchar2
- )as
. v_namevarchar2(2);
/ begin
0 p_para2:='aaaaaaaaaaaaaaaaaaaa';
1 end;
2 SQL>varp1varchar2(1);
SQL>varp2varchar2(1);
* SQL>varp3varchar2(1);
+ SQL>exec:p2:='a';
, SQL>execproc1(:p1,:p2,:p3);3
在该过程中,6* 被赋予了 *2 个字符
而在外部的调用过程中,* 这个参数仅仅被定义为 7*"#
而把 * 作为参数调用这个过程,却并没有报错。而且它的真实值就是 *2 个
代码
SQL>selectdump(:p2)fromdual;
* DUMP(:P2)
+ ---------------------------------------------------------------------------
, Typ=1Len=20:97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97
- p2
. ---------
/ aaaaaaaaaaaaaaaaaaaa
0
1 再来看看 INOUT 参数的宽度
2 createorreplaceprocedureproc1(
p_para1varchar2,
* p_para2outvarchar2,
+ p_para3inoutvarchar2
, )as
- v_namevarchar2(2);
. begin
/ p_para3:='aaaaaaaaaaaaaaaaaaaa';
0 end;
1