1.情景展示

在Oracle当中,如果我们想要对字符串进行分割的话,如何实现?

2.具体分析

Oracle没有现成的内置函数,不过,我们可以自己手动创建一个split()。

如果不想创建函数的话,也可以通过别的方式来实现,具体办法,见文末推荐。

3.解决方案

第一步:创建TYPE类型

CREATE OR REPLACE TYPE TYPE_SPLIT AS TABLE OF VARCHAR2 (4000);

 意思是:创建了一个名为TYPE_SPLIT的TABLE类型。

oracle 自定义字符串分割函数split()_分隔符

第二步:创建SPLIT函数

CREATE OR REPLACE FUNCTION SPLIT(SPLIT_STRING VARCHAR2, SPLIT_DELIMITER VARCHAR2 := ',')
RETURN TYPE_SPLIT
PIPELINED IS
IDX PLS_INTEGER;
V_STRING VARCHAR2(4000) := SPLIT_STRING;
BEGIN
LOOP
IDX := INSTR(V_STRING, SPLIT_DELIMITER);
IF IDX > 0 THEN
PIPE ROW(SUBSTR(V_STRING, 1, IDX - 1));
V_STRING := SUBSTR(V_STRING, IDX + LENGTH(SPLIT_DELIMITER));
ELSE
PIPE ROW(V_STRING);
EXIT;
END IF;
END LOOP;
END;

完成以上两步,split函数就可以正常使用了。

随后,我们在Functions当中就能够看到该函数啦。

oracle 自定义字符串分割函数split()_字符串_02

4.效果展示

调用语法:

SELECT * FROM TABLE(SPLIT('待分割字符串','分隔符'))

oracle 自定义字符串分割函数split()_字符串_03

 

 该表,有且只有一个字段:COLUMN_VALUE,我们可以对其设置别名。

oracle 自定义字符串分割函数split()_分隔符_04

该函数通常在存储过程当中使用,当然,也可以单独使用。

DECLARE
-- 用于存储分隔后的值
DEMO_SPLIT TYPE_SPLIT;
-- 待分隔字符串
STR VARCHAR2(100) := '张三|李四|王五';
-- 统计分隔符在字符串出现的次数
TIMES NUMBER;
BEGIN
-- 将字符串进行分隔
SELECT SPLIT(STR, '|') INTO DEMO_SPLIT FROM DUAL;
--统计分隔符在字符串出现的次数
TIMES := LENGTHB(TRANSLATE(STR, '|' || STR, '|'));
-- 循环打印
FOR I IN 1 .. TIMES + 1 LOOP
DBMS_OUTPUT.PUT_LINE(DEMO_SPLIT(I));
END LOOP;
END;

oracle 自定义字符串分割函数split()_字符串_05

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!


作者:Marydon