实战Oracle--自定义function

因为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
就碰到了这些问题,记下来备用。



你可能感兴趣的:(实战Oracle--自定义function)