select chr(217) from dual;
返回:Ù但是:
declare
  v_var1 varchar2(10) := null;
begin
  v_var1 := v_var1||chr(217);
  if v_var1 is null then
    dbms_output.put_line('null');
  else
    dbms_output.put_line('not null');
    dbms_output.put_line(v_var1);
  end if;  
end;
返回:null这是何故阿?谢谢解答!

解决方案 »

  1.   

    v_var1 varchar2(10) := null; 
    这一句有误
    :=null去掉
    没有赋初值本身就是空值
      

  2.   

    试了一下,:=null加上也没有语法问题
    问题是chr(217)是空的..
    select chr(217) from dual
    这个我执行结果是空,你怎么得到Ù 的
      

  3.   

    select ascii('Ù') from dual
    执行结果是43188
      

  4.   

    楼上的2位不好意思Ù是我查网上的ascii码表copy过来的,如果你在pl/sql dev中执行select chr(217) from dual,看似空的,你在格子里双击就会出现 Ù 符号。主要我们原来用的sybase数据库,有个加密存储过程,转换到oracle后发现该问题。
      

  5.   

    SQL> set serveroutput on
    SQL> 
    SQL> declare
      2    v_var1 varchar2(10) := null;
      3  begin
      4    v_var1 := v_var1||chr(217);
      5    if v_var1 is null then
      6      dbms_output.put_line('null');
      7    else
      8      dbms_output.put_line('not null');
      9      dbms_output.put_line(v_var1);
     10    end if;
     11  end;
     12  /not null
    ?PL/SQL procedure successfully completedSQL我这里执行是not null
      

  6.   

    Oracle Database 11g Enterprise Edition Release 11.1.0.7.0
      

  7.   

    你的那个Ù 有问题,双击了可以看到,但拷出来还是空的
    不要这么用
    你想查对应的ascii码的话直接用ascii函数
      

  8.   


    SQL> set serveroutput on
    SQL> declare
      2    v_var1 varchar2(10) := null;
      3  begin
      4    v_var1 := v_var1||chr(217);
      5    if v_var1 is null then
      6      dbms_output.put_line('null');
      7    else
      8      dbms_output.put_line('not null');
      9      dbms_output.put_line(v_var1);
     10    end if;
     11  end;
     12  /
    nullPL/SQL 过程已成功完成。SQL>
    SQL> select   *   from   v$version;BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
    PL/SQL Release 11.1.0.6.0 - Production
    CORE    11.1.0.6.0      Production
    TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
    NLSRTL Version 11.1.0.6.0 - ProductionSQL>
    奇怪了,我这里是null,不知道是配置问题还是版本问题。
      

  9.   


    不查,我是把用户的密码来回倒腾几次形成一个加密的码,sybase上是好的,改成oracle过程倒腾出来是null所以才找什么原因。
      

  10.   


    我也觉得是,因为发现刚才那位老兄not null是英文的提示。
      

  11.   

    SQL> select * from NLS_SESSION_PARAMETERS where rownum <= 20;PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
      

  12.   

    刚才是中文简体的字符集是null,不过和你一样的字符集上运行也是null,只能怀疑版本问题了,但一个版本号就这么大区别?搞不懂~
      

  13.   

    楼主就别管这个了,这个符号比较生僻,一般情况下不会出现这种情况
    要用的话就用chr(43188)代替吧
      

  14.   

    null与任何字符相连都是为null所以最后输出为null
      

  15.   


    错,你可以执行
    select null||'ok' from dual
    试试
      

  16.   

    sybase上null与任何字符相连都是为null,但oracle不是这样的。
    算了,不钻牛角尖了,我考虑其它方法来加密。
    谢谢你们,结帖了。