欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自建的Oracle一个字符串截取函数split_string

程序员文章站 2022-04-22 11:32:10
...
create or replace function split_string(p_expression IN VARCHAR2 ,p_split_flag IN VARCHAR2,p_length IN INTEGER,p_start_point IN INTEGER,p_number IN INTEGER)
RETURN VARCHAR2 IS
v_result VARCHAR2(200);
v_length INTEGER;
v_start_point INTEGER;
v_number INTEGER;
v_temp varchar2(200);
t_num INTEGER;
/******************************************************************************
根据设定的分界符,截取字符串中出现的第几个分界符后指定长度的字符串内容
输入参数:
       p_expression  varchar2  被截取的字符串、
       p_split_flag  varchar2  分界符、
       p_length      INTEGER   截取的字符串长度、
       p_start_point INTEGER   开始位置
       p_number      INTEGER   从开始位置开始出现的第几个分界符

返回结果:
       v_result      varchar2  返回结果,截取出字符串

注意点:
       1、被截取的字符串不能为空
       2、分解符可以为空格
       3、截取长度和第几个分解符需要给出值,默认为1
       4、开始位置默认为空

--------------------------------------------------------------------------------
Version 1.0
Created By  Pracy.Chen   2011-11-02
Mail:pracy87@163.com


*******************************************************************************/
BEGIN
     t_num :=0;
     v_length :=0;
     v_start_point :=0;
     v_number :=0;
     --处理参数
     IF trim(p_expression) is null THEN
        v_result:='';
        RETURN v_result;
     END IF;
    
     IF p_length is null OR p_length = 0 THEN
        v_length:= 1;
     ELSE
        v_length:=p_length;
     END IF;
    
     IF p_number is null OR p_number = 0 THEN
        v_number:= 1;
     ELSE
        v_number:=p_number;
     END IF;
    
     IF p_split_flag = p_expression OR p_split_flag is null THEN
        v_result:= p_expression;
        RETURN v_result;
     END IF;
     IF p_start_point is null THEN
        v_start_point:= 1;
     ELSE
        v_start_point:=p_start_point;
     END IF;

     select instr(p_expression,p_split_flag,v_start_point,v_number) into t_num from dual;
    
     IF t_num = 0 THEN
        v_result := '';
        RETURN v_result;
     END IF;
       
    
     select substr(p_expression,t_num+1,v_length) into v_temp from dual;

     IF trim(v_temp)is null THEN
        v_result:=' ';
     ELSE
        v_result:=v_temp;
     END IF;

     RETURN v_result;

EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN ' ';
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
return ' ';
END split_string;
/