建立一存储过程如下
create or replace procedure sp_a(pi_test nvarchar2) is
v_test nvarchar2(7);
begin
  v_test := '20'||'000'; --这一个地方总提示06502的错误,我改成v_test := '20'||'0'后却不再提示
  v_test := ('20'||'000');--这个可以通过
  v_test :='a';--可以通过
end sp_a;------------
我定义的v_test是7位长,而我赋值的变量是两位常量+三位常量=五位常量.应该是可以放得下得,为什么总提示6502错误,
而我把v_test加长或者把常量减掉两位,居然就不提示了,或者把这个表达式加上括号,也不会报错.
请问各位问题出在哪里?应该怎么办?

解决方案 »

  1.   

    你用的是nvarchar2,没用nchar,所以把值设大点完全没影响。v_test nvarchar2(1000); 
      

  2.   

    我试了下,没这个问题,你看看是不是过程中别的地方引起的错误。OPER@tl> declare
      2  v_test nvarchar2(7);
      3  begin
      4  v_test:='20'||'000';
      5  dbms_output.put_line(v_test);
      6  end;
      7  /
    20000PL/SQL 过程已成功完成。
      

  3.   

    可能是我们nvarchar的字符集用的不同,我的是AL16UTF16
      

  4.   

    这样试试:alter session set NLS_LENGTH_SEMANTICS=CHAR;
      

  5.   

    如果存储多语言字符,可以考虑使用nvarchar2,如果只是中英文,那还是varchar2