oracle切分字符,oracle 字符串切分包函数

create or replace package StringSplit is

type Col_MaskIndexChar is Record(

MaskIndexOfString int);

type v_table is table of Col_MaskIndexChar index by binary_integer;

My_table v_table;

Col_COUNT INT;

FUNCTION COLCOUNT(PVAR_S VARCHAR2, PVAR_MASK VARCHAR2) RETURN INT;

FUNCTION GETCOL(PVAR_S VARCHAR2, PVAR_INDEX INT, PVAR_MASK VARCHAR2) RETURN VARCHAR2;

FUNCTION COLINDEX(PVAR_S VARCHAR2,PVAR_SUBSTR VARCHAR2,PVAR_MASK VARCHAR2) RETURN INT;

end StringSplit;

/

create or replace package body StringSplit is

--获取第PVAR_INDEX列的值

FUNCTION GETCOL(PVAR_S VARCHAR2, PVAR_INDEX INT, PVAR_MASK VARCHAR2)

RETURN VARCHAR2 IS

PVAR_I INT;

I_INDEX int;

PVAR_RESULT VARCHAR2(4096);

BEGIN

PVAR_I := 0;

i_index := PVAR_INDEX;

if Col_COUNT = 0 then

Col_COUNT := COLCOUNT(PVAR_S, PVAR_MASK);

IF i_index >= Col_COUNT THEN

RETURN ' ';

END IF;

if i_index < 0 then

i_index := Col_COUNT + i_index ;

if i_index < 0 then

RETURN ' ';

end if;

end if;

else

IF i_index >= Col_COUNT THEN

RETURN ' ';

END IF;

if i_index < 0 then

i_index := Col_COUNT + i_index ;

if i_index < 0 then

RETURN ' ';

end if;

end if;

end if;

PVAR_RESULT := PVAR_MASK || PVAR_S;

PVAR_RESULT := SUBSTR(PVAR_RESULT,

my_table (i_index).MaskIndexOfString,

my_table (i_index + 1).MaskIndexOfString - my_table(i_index)

.MaskIndexOfString - 1);

RETURN PVAR_RESULT;

END GETCOL;

--获取被分隔符分割的列数

FUNCTION COLCOUNT(PVAR_S VARCHAR2, PVAR_MASK VARCHAR2) RETURN INT IS

PVAR_I INT;

PVAR_LEN INT;

PVAR_COUNT INT;

PVAR_INST INT;

PVAR_RESULT varchar2(4096);

BEGIN

PVAR_I := 0;

PVAR_LEN := LENGTH(PVAR_S);

PVAR_COUNT := 0;

IF PVAR_LEN = 0 THEN

RETURN PVAR_COUNT;

END IF;

PVAR_RESULT := PVAR_MASK || PVAR_S || PVAR_MASK;

WHILE PVAR_I < PVAR_LEN + 2 LOOP

PVAR_I := PVAR_I + 1;

PVAR_INST := INSTR(PVAR_RESULT, PVAR_MASK, PVAR_I);

IF PVAR_INST > 0 THEN

PVAR_I := PVAR_INST;

PVAR_COUNT := PVAR_COUNT + 1;

my_table(PVAR_COUNT - 1).MaskIndexOfString := PVAR_INST + 1;

END IF;

END LOOP;

Col_COUNT := PVAR_COUNT - 1;

RETURN PVAR_COUNT - 1;

END COLCOUNT;

FUNCTION COLINDEX(PVAR_S VARCHAR2,

PVAR_SUBSTR VARCHAR2,

PVAR_MASK VARCHAR2) RETURN INT IS

PVAR_I INT;

PVAR_COUNT INT;

PVAR_RESULT INT;

BEGIN

PVAR_I := 0;

PVAR_RESULT := -1;

PVAR_COUNT := COLCOUNT(PVAR_S, PVAR_MASK);

WHILE PVAR_I < PVAR_COUNT LOOP

IF GETCOL(PVAR_S, PVAR_I, PVAR_MASK) = PVAR_SUBSTR THEN

PVAR_RESULT := PVAR_I;

EXIT;

END IF;

PVAR_I := PVAR_I + 1;

END LOOP;

RETURN PVAR_RESULT;

END COLINDEX;

begin

-- Initialization

Col_COUNT := 0;

null;

end StringSplit;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值