oracle 数组字段循环,用Oracle的函数实现数组然后循环

1、先建立一个包,定义数组类型:

CREATE OR REPLACE PACKAGE pkg_string is

-- Purpose : 字符串处理

-- Public type declarations

TYPE StringArray IS VARRAY(2000) OF VARCHAR2(2000);

END pkg_string;

2、拆分字符串的通用函数,即数组的函数:

CREATE OR REPLACE FUNCTION fun_ParseToArray(

a_SourceString IN VARCHAR2, --源字符串

a_Delimiter IN VARCHAR2 --拆分的分隔符

) RETURN pkg_string.StringArray IS

-- ********************************************************

-- 根据分隔符拆分字符串为数组

-- ********************************************************

v_Result pkg_string.StringArray; --数组

iCount INTEGER;

iBegin INTEGER;

sValue VARCHAR2(2000);

sSplitString VARCHAR2(2000);

BEGIN

--检查参数

IF a_SourceString IS NULL OR a_Delimiter IS NULL THEN

RETURN(v_Result);

END IF;

IF a_SourceString = '' THEN

RETURN(v_Result);

END IF;

--初始化数组

v_Result := pkg_string.StringArray();

--Only one entry was found

IF instr(a_SourceString,a_Delimiter) = 0 THEN

-- 数组加1维

v_Result.extend();

-- 将数据存入数组

v_Result(1) := a_SourceString;

RETURN(v_Result);

END IF;

iCount := 0;

sSplitString := a_SourceString;

LOOP

iBegin := INSTR(sSplitString,a_Delimiter);

EXIT WHEN iBegin < 1;

sValue := Substr(sSplitString,1,iBegin - 1);

sSplitString := SubStr(sSplitString,iBegin + 1);

-- 计数器加1

iCount := iCount + 1;

-- 数组加1维

v_Result.extend();

-- 将数据存入数组

v_Result(iCount) := sValue;

END LOOP;

--Set last entry

sSplitString := SubStr(sSplitString, iBegin);

--Update array and counter if necessary

IF Length(sSplitString) > 0 THEN

-- 计数器加1

iCount := iCount + 1;

-- 数组加1维

v_Result.extend();

-- 将数据存入数组

v_Result(iCount) := sSplitString;

END IF;

RETURN(v_Result);

EXCEPTION

WHEN others THEN

return v_Result ;

END fun_ParseToArray;

3、用法:

CREATE OR REPLACE FUNCTION demo(--占比值

field in VARCHAR

)

RETURN VARCHAR2

IS

v_sql VARCHAR2(4000) := '';

v_number number;

vs_row pkg_string.StringArray;

BEGIN

--求传入字段的分割之后的size,例子field=123,456

SELECT LENGTHB(TRANSLATE(field,','||field,',')) into v_number FROM DUAL;

v_number := v_number+1;

--分割字符串组成数组

vs_row := fun_ParseToArray(field,',');

--循环数组

for i in 1 .. v_number loop

v_sql := v_sql || vs_row(i)||'ccc';

end loop;

if v_sql is not null then

RETURN v_sql;

else

RETURN '【数值为空】';

end if;

EXCEPTION

WHEN NO_DATA_FOUND THEN

return ('你需要的数据不存在!');

WHEN OTHERS THEN

return '错误';

END demo;

参考:https://sangei.iteye.com/blog/1343837

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值