Posted on 2006-08-01 08:01
Earth 阅读(1280)
评论(0) 编辑 收藏 所属分类:
Java
因为oracle9i不支持正则表达式,REPLACE函数不够强大,只好自己写了一个函数。
需求:
把给定的字符串中的数字部分去掉,如果101 North Steet替换成 North Street
使用方法:
select REPLACE_NUM('101 North Steet') from dual
开发工具: Toad(有Debug功能,写function, procedure非常方便)
方法。
1。先找到Toad中Schema Browser的Procs标签栏。
2。Create New Object. Object Type: function. New Object Name: REPLACE_NUM. OK!
3。代码如下:
/* Formatted on 2006/05/15 13:57 (Formatter Plus v4.8.5) */
CREATE OR REPLACE FUNCTION replace_num (street_name IN VARCHAR2)
RETURN VARCHAR2
IS
RESULT VARCHAR2 (1000);
num NUMBER (3) := 0;
beginindex NUMBER (3) := 1;
endindex NUMBER (3) := 1;
j NUMBER (3) := 1;
letter CHAR (1);
temp CHAR (1);
BEGIN
num := LENGTH (street_name);
IF num IS NULL OR num = 0
THEN
RETURN street_name;
END IF;
endindex := num;
-- find the first digit
FOR i IN 1 .. num
LOOP
temp := SUBSTR (street_name, i, 1);
IF (ASCII (temp) >= 48 AND ASCII (temp) <= 57)
THEN
beginindex := i;
EXIT;
END IF;
END LOOP;
-- find last digit
j := num;
WHILE j >= 1
LOOP
temp := SUBSTR (street_name, j, 1);
IF (ASCII (temp) >= 48 AND ASCII (temp) <= 57)
THEN
endindex := j;
EXIT;
END IF;
j := j - 1;
END LOOP;
-- find digit block
RESULT := SUBSTR (street_name, beginindex, endindex - beginindex + 1);
-- return string without number
RESULT := REPLACE (street_name, RESULT);
RETURN RESULT;
END replace_num;
第一次写函数,碰到了下面一些问题:
声明变量的时候用DECLARE会报错,后来改成IS就好了
赋值符号是:=,不是=, 条件与是and不是&&
if语句块不能用花括号,用if 条件 then 语句块 end if;
for语句FOR i IN 1 .. num,
其中1..num不能写成num..1,我以为这样可以使i递减,原来不可以
后来改成while语句,并用j := j - 1;进行递减
跳出循环是exit不是break, LENGTH(null)返回null而不是0
就碰到了这些问题,记下来备用。