【发布时间】:2017-11-27 22:46:30
【问题描述】:
我正在尝试使用逗号分隔的字符串并将每个值作为新行插入到表中。我从 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: comma-separated list invalid near 33-23
如何处理“33-23”形式的数据?如果我从我的数据中取出“-”,上述将按需要运行。这并不理想,因为我的一些数据中会包含“-”并且无法删除。
【问题讨论】:
-
你认为
dbms_utility.comma_to_table的过程是做什么的?它适用于数据库标识符(格式为schema.table.column@link及其变体)。现在,您可能会滥用它来拆分逗号分隔的字符串,正如您正在尝试的那样 - 会产生不可预测的结果。标识符中不允许使用破折号。无论如何,如果您需要拆分逗号分隔的字符串,请这样说;有很多方法,但comma_to_table过程不是其中之一。 -
用下划线替换它们
-
等等... Lalit 是否将其显示为一种拆分字符串的方法?还是他用它来做别的事情?如果他显示它用于拆分字符串,请提供链接;他应该从有效方法列表中删除此方法。
-
@Used_By_Already 我无法修改数据。数据代表我的真实数据的样子,因此我无法修改数据,只需插入即可。
-
@mathguy 是的,Lalit 将其显示为“将逗号分隔的字符串值插入表中”的一种方式,这正是我需要做的。这是链接.. lalitkumarb.wordpress.com/2014/03/07/…