此示例是将一个字符串根据指定的分隔符分割成多列数据...
- 输入参数
p_value
是要分割的字符串。 - 输入参数
p_split
是用作分隔符的字符,默认值为逗号(,
)
- 创建type
CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (500)
2.创建Function
CREATE OR REPLACE FUNCTION SPLIT_STR(
P_VALUE IN VARCHAR2, -- 输入参数,需要分割的字符串
P_SPLIT IN VARCHAR2 := ',' -- 输入参数,用作分隔符,默认为逗号
)
RETURN SPLIT_TYPE -- 指定返回类型
PIPELINED IS
V_IDX INTEGER; -- 用于存储分隔符位置的索引变量
V_STR VARCHAR2(500); -- 用于存储每次分割得到的字符串段
V_STRS_LAST VARCHAR2(4000) := P_VALUE; -- 存储原始字符串的副本,用于分割
BEGIN
V_STRS_LAST := REPLACE(V_STRS_LAST, '";"', ',');
-- 开始循环,直到没有更多的分隔符
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 为剩余的字符串部分,移除已处理的部分
V_STRS_LAST := SUBSTR(V_STRS_LAST, V_IDX + 1);
-- 将提取的子字符串作为结果输出
PIPE ROW(V_STR);
END LOOP;
-- 输出最后一个分割得到的字符串段
PIPE ROW(V_STRS_LAST);
-- 结束函数,返回结果
RETURN;
END SPLIT_STR;
3.测试代码
DECLARE
v_result SPLIT_TYPE;
v_row SPLIT_TYPE; -- 声明变量以存储从游标中检索的行
BEGIN
-- 调用 SPLIT_STR 函数并初始化结果集变量
SELECT * BULK COLLECT INTO v_result
FROM TABLE(SPLIT_STR('apple,banana,cherry,date'));
-- 遍历结果集并打印每一行
FOR i IN 1 .. v_result.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Level: ' || i || ' V_LINE: ' || v_result(i));
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occurred: ' || SQLERRM);
END;
4.测试结果