Let's go inside

          this blog is deprecated as a result of laziness.
          posts - 59, comments - 2, trackbacks - 0, articles - 0

          實(shí)戰(zhàn)Oracle--自定義function

          Posted on 2006-08-01 08:01 Earth 閱讀(1291) 評論(0)  編輯  收藏 所屬分類: Java

          因?yàn)閛racle9i不支持正則表達(dá)式,REPLACE函數(shù)不夠強(qiáng)大,只好自己寫了一個函數(shù)。

          需求:
          把給定的字符串中的數(shù)字部分去掉,如果101 North Steet替換成 North Street

          使用方法:
          select REPLACE_NUM('101 North Steet') from dual

          開發(fā)工具: Toad(有Debug功能,寫function, procedure非常方便)

          方法。

          1。先找到Toad中Schema Browser的Procs標(biāo)簽欄。
          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;
          第一次寫函數(shù),碰到了下面一些問題:
          聲明變量的時候用DECLARE會報錯,后來改成IS就好了
          賦值符號是:=,不是=, 條件與是and不是&&
          if語句塊不能用花括號,用if 條件 then 語句塊 end if;
          for語句FOR i IN 1 .. num, 
          其中1..num不能寫成num..1,我以為這樣可以使i遞減,原來不可以
          后來改成while語句,并用j := j - 1;進(jìn)行遞減
          跳出循環(huán)是exit不是break, LENGTH(null)返回null而不是0
          就碰到了這些問題,記下來備用。

          主站蜘蛛池模板: 大荔县| 临清市| 阳高县| 凉山| 启东市| 二连浩特市| 依安县| 南川市| 赤城县| 城口县| 靖州| 芜湖市| 安仁县| 汉寿县| 南澳县| 宁陵县| 宝山区| 孝义市| 崇信县| 奉节县| 寿光市| 阿克陶县| 嘉峪关市| 遂溪县| 勃利县| 边坝县| 额济纳旗| 阳原县| 乐平市| 石河子市| 竹山县| 巴楚县| 尉犁县| 正定县| 安溪县| 油尖旺区| 荆门市| 潢川县| 双流县| 南澳县| 鱼台县|