逗号分隔列表无效附近..使用comma_to_table

时间:2017-11-27 22:46:30

标签: oracle plsql oracle11g

我正在尝试使用逗号分隔的字符串,并将每个值作为新行插入表中。我从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"?如果我采取' - '根据我的数据,上面的内容将按照需要运行。这并不理想,因为我的一些数据会有' - '在它,它无法删除。

1 个答案:

答案 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