概述
- 通过 管道函数 pipelined 实现
演示
效果展示:
首先定义类型:
CREATE TYPE scott.ty_object_map IS OBJECT
(
v_key NUMBER,
v_value VARCHAR2(100)
)
;
/
CREATE TYPE scott.ty_table_map IS TABLE OF scott.ty_object_map;
/
-- 删除type、若需要
DROP TYPE scott.ty_table_map;
DROP TYPE scott.ty_object_map;
package head:
CREATE OR REPLACE PACKAGE scott.pkg_char_handle_util IS
FUNCTION f_split_string(p_string IN VARCHAR2,
p_delimiter IN VARCHAR2) RETURN scott.ty_table_map
PIPELINED;
END pkg_char_handle_util;
/
package body:
CREATE OR REPLACE PACKAGE BODY scott.pkg_char_handle_util IS
--************************************************
-- 功能: 切割字符串
-- 参数: p_string 字符串
-- p_delimiter 分隔符
-- 返回值: table 类型
--************************************************
FUNCTION f_split_string(p_string IN VARCHAR2,
p_delimiter IN VARCHAR2) RETURN scott.ty_table_map
PIPELINED IS
v_length PLS_INTEGER := length(p_string); -- 字符串长度
v_start PLS_INTEGER := 1; -- 字符开始位置
v_index PLS_INTEGER; -- 下标
v_key PLS_INTEGER := 1; -- 截取后,字符串的个数
v_object_map scott.ty_object_map;
BEGIN
WHILE (v_start <= v_length) LOOP
-- 获取符合条件的 第一个下标
v_index := instr(p_string, p_delimiter, v_start);
IF v_index = 0 THEN
-- 没有符合条件的记录,直接打印,如 string = 'a', 直接打印 a
v_object_map := scott.ty_object_map(v_key,
substr(p_string, v_start));
PIPE ROW(v_object_map);
RETURN;
ELSE
-- 否则,循环截取打印
v_object_map := scott.ty_object_map(v_key,
substr(p_string,
v_start,
v_index - v_start));
PIPE ROW(v_object_map);
-- 循环判断依据: 每次 '分隔符' 后 '第一个字符'
v_start := v_index + 1;
END IF;
-- 个数递增
v_key := v_key + 1;
END LOOP;
RETURN;
END f_split_string;
END pkg_char_handle_util;
/