CREATE OR REPLACE PACKAGE PACKAGE_SPLIT IS

  -- Author  : EX_HUXINSHENG
  -- Created : 2008-2-14 8:31:50
  -- Purpose :

  -- Public type declarations
  TYPE TY_STR_ARRAY IS TABLE OF VARCHAR2(4000);

  -- Public function and procedure declarations
  /**
  * @方法说明:String字符串的分拆方法,返回数组集合
  * @P_STR VARCHAR2 需要分拆的字符串
  * @P_DELIMITER VARCHAR2 分隔符
  * @RETURN TY_STR_ARRAY 返回数组类型
  */
  FUNCTION FN_SPLIT(P_STR IN VARCHAR2, P_DELIMITER IN VARCHAR2)
    RETURN TY_STR_ARRAY;

  /**
  * @方法说明:String字符串的分拆方法,返回索引字符串
  * @P_STR VARCHAR2 需要分拆的字符串
  * @P_DELIMITER VARCHAR2 分隔符
  * @P_INDEX INTEGER  索引下标
  * @P_MSG   VARCHAR2 返回相关信息
  * @RETURN VARCHAR2 返回字符类型
  */
  FUNCTION FN_SPLIT(P_STR       IN VARCHAR2,
                    P_DELIMITER IN VARCHAR2,
                    P_INDEX     IN INTEGER,
                    P_MSG       OUT VARCHAR2) RETURN VARCHAR2;
END PACKAGE_SPLIT;


----------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PACKAGE BODY PACKAGE_SPLIT IS
  /**
  * @方法说明:String字符串的分拆方法,返回数组集合
  * @P_STR VARCHAR2 需要分拆的字符串
  * @P_DELIMITER VARCHAR2 分隔符
  * @RETURN TY_STR_ARRAY 返回数组类型
  */
  FUNCTION FN_SPLIT(P_STR IN VARCHAR2, P_DELIMITER IN VARCHAR2)
    RETURN TY_STR_ARRAY IS
    J         INT := 0;
    I         INT := 1;
    LEN       INT := 0;
    LEN1      INT := 0;
    STR       VARCHAR2(4000);
    STR_ARRAY TY_STR_ARRAY := TY_STR_ARRAY();
  BEGIN
    LEN  := LENGTH(P_STR);
    LEN1 := LENGTH(P_DELIMITER);

    WHILE J < LEN LOOP
      J := INSTR(P_STR, P_DELIMITER, I);

      IF J = 0 THEN
        J   := LEN;
        STR := SUBSTR(P_STR, I);
        STR_ARRAY.EXTEND;
        STR_ARRAY(STR_ARRAY.COUNT) := STR;

        IF I >= LEN THEN
          EXIT;
        END IF;
      ELSE
        STR := SUBSTR(P_STR, I, J - I);
        I   := J + LEN1;
        STR_ARRAY.EXTEND;
        STR_ARRAY(STR_ARRAY.COUNT) := STR;
      END IF;
    END LOOP;
    RETURN STR_ARRAY;
  END FN_SPLIT;

  /**
  * @方法说明:String字符串的分拆方法,返回索引字符串
  * @P_STR VARCHAR2 需要分拆的字符串
  * @P_DELIMITER VARCHAR2 分隔符
  * @P_INDEX INTEGER  索引下标
  * @P_MSG   VARCHAR2 返回相关信息
  * @RETURN VARCHAR2 返回字符类型
  */
  FUNCTION FN_SPLIT(P_STR       IN VARCHAR2,
                    P_DELIMITER IN VARCHAR2,
                    P_INDEX     IN INTEGER,
                    P_MSG       OUT VARCHAR2) RETURN VARCHAR2 IS
    STR_ARRAY TY_STR_ARRAY;
  BEGIN
    STR_ARRAY:= FN_SPLIT(P_STR,P_DELIMITER);
    IF P_INDEX<=STR_ARRAY.COUNT THEN
       P_MSG:='找到数据,调用成功';
       RETURN STR_ARRAY(P_INDEX);
    ELSE
       P_MSG:='数组索引越界,索引为: '||p_INDEX||' 数组大小为: '||STR_ARRAY.COUNT;
       RETURN '';
    END IF;
  END FN_SPLIT;
END PACKAGE_SPLIT;

posted on 2012-04-26 13:47  Buddy  阅读(607)  评论(0编辑  收藏  举报