set serveroutput oncreate or replace procedure test
(
value in varchar2
)
as
v_value varchar2(20);
begin
v_value:=value;
dbms_output.put_line(v_value);
end;
/这样执行时没有问题的
===============================================================================
set serveroutput oncreate or replace procedure test
(
value in varchar2
)
as
v_value varchar2;
begin
v_value:=value;
dbms_output.put_line(v_value);
end;
/这样执行会报错PLS-OO215:String length constraints must be in range(1..32767) 
==============================================================================
set serveroutput oncreate or replace procedure test
(
value in varchar2(20)
)
as
v_value varchar2;
begin
v_value:=value;
dbms_output.put_line(v_value);
end;
/这样执行也会报错
PLS-00103:Encountered the symbol "(" when expecting one of the following:
:= . ) , @ % default character
The symbol ":=" was substituted for "(" to continue.
===============================================================================
为什么在参数里不能指定长度而在本地变量的地方却必须指定长度?
请帮忙解释一下这两个错误

解决方案 »

  1.   

    过程和函数中的参数的类型只需要声明类型不必须指定长度(精度); 
    带参数的cursor的参数也只需要声明类型不必须指定长度(精度); 
    只有单独声明的变量需要指定长度(精度);不只是varchar2如此,number等其他类型也是如此
      

  2.   


    这样执行会报错PLS-OO215:String length constraints must be in range(1..32767) 是因为
    v_value varchar2;
    这里不对
    要改成
    v_value varchar2(100); --需要设定长度。 参数和返回值的类型不要设置长度,但是变量需要=============================================================================== 
    为什么在参数里不能指定长度而在本地变量的地方却必须指定长度? 同上面的解释。参数和返回值的类型不要设置长度,但是变量需要
      

  3.   

    number好像可以不指定长度
    set serveroutput oncreate or replace procedure test
    (
    value in number
    )
    as
    v_value number;
    begin
    v_value:=value;
    dbms_output.put_line(v_value);
    end;
      

  4.   

    不好意思,数值类型可以缺省
    刚才查了下:Number(p,s):P和s都是可选的。P指精度(precision),即总位数。默认情况下精度为38。精度的取值范围为1~38。S指小数位(scale),小数点右边的位数。小数点位数的合法值为-84~127。小数位的默认值由精度来决定。如果没有指定精度,小数位默认为最大的取值区间。如果指定了精度,没有指定小数位。小数位默认为0(即没有小数位)。精度和小数位不会影响数据如何存储,只会影响允许哪些数值及数值如何舍入。