Let's go inside

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

          實戰Oracle--自定義function

          Posted on 2006-08-01 08:01 Earth 閱讀(1285) 評論(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
          就碰到了這些問題,記下來備用。

          主站蜘蛛池模板: 科尔| 来宾市| 兰溪市| 县级市| 马鞍山市| 鄂尔多斯市| 沙坪坝区| 邯郸市| 安平县| 白河县| 靖边县| 通许县| 中阳县| 旅游| 清新县| 运城市| 惠水县| 萍乡市| 巩留县| 新丰县| 曲阳县| 平和县| 玛纳斯县| 咸丰县| 历史| 额尔古纳市| 延津县| 榕江县| 贵州省| 敖汉旗| 陵川县| 抚顺县| 浦东新区| 嵊州市| 左云县| 柯坪县| 普定县| 米易县| 鄂州市| 辛集市| 咸阳市|