Oracle PL/SQL中如何按换行分割字符串并存入数组?
在PL/SQL中实现换行分隔字符串转数组
当然可以实现啦!在PL/SQL里有多种方法能把换行分隔的字符串拆分成数组,下面给你分享几个实用的方案:
1. 自定义循环拆分(通用无依赖方案)
如果你的Oracle环境没有额外工具包依赖,用基础字符串函数就能搞定。首先我们需要定义一个字符串数组类型,再通过循环结合INSTR和SUBSTR完成拆分:
-- 先创建字符串数组类型(只需执行一次) CREATE OR REPLACE TYPE string_array AS TABLE OF VARCHAR2(100); / DECLARE -- 模拟带换行的输入字符串,CHR(10)代表Unix/Linux换行符 v_input_str VARCHAR2(200) := 'Hello Tom' || CHR(10) || 'Where are you' || CHR(10) || 'What''s your name'; v_delimiter VARCHAR2(2) := CHR(10); -- Windows环境可改为CHR(13)||CHR(10),按需调整 v_start_pos NUMBER := 1; v_end_pos NUMBER; v_result string_array := string_array(); BEGIN LOOP -- 定位下一个换行符的位置 v_end_pos := INSTR(v_input_str, v_delimiter, v_start_pos); IF v_end_pos = 0 THEN -- 处理最后一段无换行符的字符串 v_result.EXTEND; v_result(v_result.COUNT) := SUBSTR(v_input_str, v_start_pos); EXIT; END IF; -- 截取当前段并加入数组 v_result.EXTEND; v_result(v_result.COUNT) := SUBSTR(v_input_str, v_start_pos, v_end_pos - v_start_pos); v_start_pos := v_end_pos + LENGTH(v_delimiter); END LOOP; -- 验证输出结果(可选) FOR i IN v_result.FIRST .. v_result.LAST LOOP DBMS_OUTPUT.PUT_LINE('数组元素 ' || i || ': ' || v_result(i)); END LOOP; END; /
2. 用APEX_STRING工具包(简洁高效方案)
如果你的环境使用Oracle APEX,直接用APEX_STRING.SPLIT函数就能一行完成拆分,代码更简洁:
DECLARE v_input_str VARCHAR2(200) := 'Hello Tom' || CHR(10) || 'Where are you' || CHR(10) || 'What''s your name'; v_result string_array; BEGIN -- 直接拆分并转换为自定义数组类型 v_result := string_array(APEX_STRING.SPLIT(v_input_str, CHR(10))); -- 验证输出结果(可选) FOR i IN v_result.FIRST .. v_result.LAST LOOP DBMS_OUTPUT.PUT_LINE('数组元素 ' || i || ': ' || v_result(i)); END LOOP; END; /
小提示
- 换行符适配:不同系统换行符不同,Unix/Linux用
CHR(10),Windows用CHR(13)||CHR(10),请根据实际输入调整分隔符。 - 数组类型替代:你也可以用Oracle自带的
SYS.ODCIVARCHAR2LIST类型,省去创建自定义类型的步骤。
内容的提问来源于stack exchange,提问作者Vara Mahalakhmi




