我正在尝试使用逗号分隔的字符串,并将每个值作为新行插入表中。我从Lalit Kumar B获取了以下示例,并将数据修改为类似于我的数据的样子。
DECLARE
L_INPUT VARCHAR2(4000) := '522,33-23,125,658,25,12-500';
L_COUNT BINARY_INTEGER;
L_ARRAY DBMS_UTILITY.LNAME_ARRAY;
BEGIN
DBMS_UTILITY.COMMA_TO_TABLE(LIST => REGEXP_REPLACE(L_INPUT, '(^|,)', '\1x'), TABLEN => L_COUNT, TAB => L_ARRAY);
DBMS_OUTPUT.PUT_LINE(L_COUNT);
FOR I IN 1 .. L_COUNT
LOOP
DBMS_OUTPUT.PUT_LINE('Element ' || TO_CHAR(I) || ' of array contains: ' || SUBSTR(L_ARRAY(I), 2));
INSERT INTO TEST22 VALUES
(SUBSTR(L_ARRAY(I), 2)
);
COMMIT;
END LOOP;
END;
我收到以下oracle错误:ORA-20001:逗号分隔列表在33-23附近无效
如何处理表格数据" 33-23"?如果我采取' - '根据我的数据,上面的内容将按照需要运行。这并不理想,因为我的一些数据会有' - '在它,它无法删除。
答案 0 :(得分:1)
一种方法是使用CONNECT BY有效地循环遍历字符串元素。如果您只运行查询,您将看到它是如何工作的。正则表达式允许出现NULL列表元素。
insert into TEST(col_a)
select regexp_substr('522,33-23,125,658,25,12-500', '(.*?)(,|$)', 1, level, null, 1)
from dual
connect by level <= regexp_count('522,33-23,125,658,25,12-500', ',')+1