源库(ORACLE)字符串分割函数

源库SQL-ORACLE

功能:将输入的字符串以分隔符默认是’,’分割进行输出表格的形式。这里还用到了自定义的类型如下:

1
create or replace TYPE "STRSPLIT_TYPE" IS TABLE OF VARCHAR2 (4000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace function strsplit(p_value varchar2,
p_split varchar2 := ',')
--usage: select * from table(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 strsplit;
/

执行效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL> select * from table(strsplit('hahha:dfdfdf,ffff,2f,3d,4e',','));

COLUMN_VALUE
--------------------------------------------------------------------------------
hahha:dfdfdf
ffff
2f
3d
4e
SQL> select * from table(strsplit('hahha:dfdfdf,ffff,2f,3d,4e',':'));

COLUMN_VALUE
--------------------------------------------------------------------------------
hahha
dfdfdf,ffff,2f,3d,4e

目标库(MogDB)改造后的字符串分割函数

目标库SQL:MogDB

MogDB 自带regexp_split_to_table函数,进行改造如下,然后直接查询即可。

1
2
3
4
5
6
7
8
9
CREATE OR REPLACE FUNCTION strsplit(p_value text, p_split text DEFAULT ','::text)
RETURNS TABLE(output_string text)
LANGUAGE plpgsql
NOT FENCED NOT SHIPPABLE
AS $function$
BEGIN
RETURN QUERY SELECT * FROM regexp_split_to_table(p_value, p_split);
END
$function$;
1
2
3
4
5
6
liups=> select strsplit('hahha:dfdfdf,ffff,2f,3d,4e',':');
split2list
----------------------
hahha
dfdfdf,ffff,2f,3d,4e
(2 rows)

目标库(MogDB)里 存储过程中调用字符串分割函数的改造

源库SQL-ORACLE

1
2
FOR C IN (SELECT COLUMN_VALUE SQLS FROM TABLE(strsplit(SQL_STMT, ';'))) LOOP
SQL_STMT_TEMP := C.SQLS;

目标库SQL:MogDB

MogDB 直接通过 select 直接查询就可以了。

1
2
FOR C IN (SELECT  * FROM strsplit(SQL_STMT, ';')) LOOP
SQL_STMT_TEMP := C.output_string;

原文作者: Hi.MogDB

原文链接: https://hi.mogdb.org/posts/d331825a/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议