select * from table(fun_strsplit('1,2,3,4,5'));
1、创建一个类型
CREATE OR REPLACE TYPE Strsplit_Type IS TABLE OF VARCHAR2(4000)
2、创建函数
CREATE OR REPLACE FUNCTION Fun_Strsplit(p_Value VARCHAR2, p_Split VARCHAR2 := ',') --usage: select * from table(fun_strsplit('1,2,3,4,5')) RETURN Strsplit_Type PIPELINED IS v_Idx INTEGER; v_Str VARCHAR2(500); v_Strs_Last VARCHAR2(4000) := p_Value; BEGIN LOOP v_Idx := Instr(v_Strs_Last, p_Split); EXIT WHEN v_Idx = 0; v_Str := Substr(v_Strs_Last, 1, v_Idx - 1); v_Strs_Last := Substr(v_Strs_Last, v_Idx + 1); PIPE ROW(v_Str); END LOOP; PIPE ROW(v_Strs_Last); RETURN; END Fun_Strsplit;
我本想把这个函数用在大批量数据处理中,后来发现写在sql中会导致性能慢很多倍,因为方法中有循环
例:
假如每行数据中需要用split循环8次,split(1,2,3,4,5,6,7,8)
split前 1W行 2秒 用split后 1W行 2*8=16秒
split前 100W行 100秒 用split后 100W行 100*8=800秒 比之前多了700秒
我这里的比喻不一定准确,我只是认为大数据量千万别用循环嵌套在里面,数据量越大损耗越多。