数据库老人请来,PL/SQL中的VARCHAR2和LTRIM问题!
问题简述:
一般认为声明时这样写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一般思想是去掉左边相同的子串,我想不通上面两句的执行思路?请高手解答。