问题简述:    一般认为声明时这样写V_OLDSTR VARCHAR2(50):='';的结果是V_OLDSTR为'',但是昨天写函数时遇到以下问题:CREATE OR REPLACE FUNCTION F_MYSORT(V_STR IN VARCHAR2) --排序主函数
RETURN VARCHAR2 IS V_OLDSTR VARCHAR2(50):='';
V_NEWSTR VARCHAR2(50):=''; --保存结果的串
V_RIGHT VARCHAR2(50):='';
V_LEFT VARCHAR2(50):='';
V_DATA NUMBER(9):=0; --当前数据
V_POS NUMBER(9):=0; --保存插入位置BEGIN
V_OLDSTR:=V_STR||',';
V_RIGHT:=V_OLDSTR;
V_LEFT:=SUBSTR(V_RIGHT,1,INSTR(V_RIGHT,','));
--V_RIGHT:=LTRIM(V_RIGHT,V_LEFT);
V_RIGHT:=SUBSTR(V_RIGHT,LENGTH(V_LEFT)+1); WHILE LENGTH(V_LEFT)>0 LOOP
V_DATA:=TO_NUMBER(SUBSTR(V_LEFT,1,LENGTH(V_LEFT)-1));
--V_DATA:=TO_NUMBER(RTRIM(V_LEFT,','));
IF V_NEWSTR='' THEN --目标串为空时
V_NEWSTR:=TO_CHAR(V_DATA)||',';
ELSE
V_POS:=F_FINDPOS(V_NEWSTR,V_DATA);
V_NEWSTR:=SUBSTR(V_NEWSTR,1,V_POS)||TO_CHAR(V_DATA)||','||SUBSTR(V_NEWSTR,V_POS+1);
END IF; V_LEFT:=SUBSTR(V_RIGHT,1,INSTR(V_RIGHT,','));
--V_RIGHT:=LTRIM(V_RIGHT,V_LEFT);
V_RIGHT:=SUBSTR(V_RIGHT,LENGTH(V_LEFT)+1);
END LOOP; DBMS_OUTPUT.PUT_LINE(SUBSTR(V_NEWSTR,1,LENGTH(V_NEWSTR)-1));
RETURN SUBSTR(V_NEWSTR,1,LENGTH(V_NEWSTR)-1);
END F_MYSORT;程序会运行出错,刚开始一直找不到原有,后来发现把上面的红色语句改成
V_NEWSTR VARCHAR2(50):='*';

IF V_NEWSTR='*' THEN ...
就OK了,很无语,因为我测试时把它改成IF V_NEWSTR='' OR V_NEWSTR=NULL THEN 都不行,一样报错。
高手请告诉我为什么?麻烦了。另外还有个小问题
* select ltrim('Mississippi','Mis') from dual;='ppi'
  * select ltrim('63972Tech','123456789') from dual;='Tech'
LTRIM一般思想是去掉左边相同的子串,我想不通上面两句的执行思路?请高手解答。

解决方案 »

  1.   

     V_NEWSTR=NULL  改成 V_NEWSTR is NULL试试
      

  2.   

    如果你想达到''的效果,需要写成
    V_OLDSTR VARCHAR2(50) := null;
      

  3.   

    LTRIM:
    PurposeLTRIM removes from the left end of char all of the characters contained in set. If you do not specify set, it defaults to a single blank. If char is a character literal, then you must enclose it in single quotes. Oracle Database begins scanning char from its first character and removes all characters that appear in set until reaching a character not in set and then returns the result.Both char and set can be any of the datatypes CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB. The string returned is of VARCHAR2 datatype and is in the same character set as char.
      

  4.   

    我擦,改成IS NULL可以,不过为什么是NULL,我不是初始化过了吗?
      

  5.   

    2楼方法也可以,不过为什么?
    PL/SQL的初始化是什么原理?赋值''时为什么不可以?
      

  6.   

    初始化为null不能用 := '':= null
      

  7.   

    * select ltrim('Mississippi','Mis') from dual;='ppi' 
      * select ltrim('63972Tech','123456789') from dual;='Tech' 
    用 replace() * select replace('Mississippi','Mis','') from dual;
      * select replace('63972Tech','123456789','') from dual;
      

  8.   

    看看oracle的数据类型部分,对于null有专门的讲解
      

  9.   

    ltrim(a,b) 是去掉a从左边第一个字符开始到第一个不在b中字符的位置之间的所有字符rtrim(a,b) 是从右边开始去掉eg:ltrim('misisippmi','mis') 结果为 ppmi 
      

  10.   

    我在10g写declare
    name varchar2(20):=null;
    begin
    if name is null then
    dbms_output.put_line('为空');
    end if;
    end;是可以的
      

  11.   

    7楼点醒了,我要的功能实际上时REPLACE,呵,谢谢