首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逗号分隔列表无效..。用comma_to_table

逗号分隔列表无效..。用comma_to_table
EN

Stack Overflow用户
提问于 2017-11-27 22:46:30
回答 2查看 2.3K关注 0票数 0

我正在尝试接受一个逗号分隔字符串,并将每个值作为一个新行插入到表中。我从Lalit中选取了下面的例子,并对数据进行了修改,使其类似于我的数据。

代码语言:javascript
复制
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;

我收到以下甲骨文错误: ORA-20001:逗号分隔的列表在33-23附近无效。

如何处理表格"33-23“的数据?如果我将“-”从我的数据中取出来,那么上面的内容将按需要运行。这是不理想的,因为我的一些数据将在其中“-”,它不能被删除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-30 20:31:35

一种方法是使用CONNECT BY有效地循环字符串元素。如果您只运行这个查询,您将看到这是如何工作的。正则表达式允许在出现空列表元素时使用它们。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-11-28 06:44:13

我对DBMS_UTILITY.COMMA_TO_TABLE也有同样的问题。它有一些带有数字字符串的错误。我尝试了一些方法,并最终编写了这个函数而不是它。

代码语言:javascript
复制
CREATE OR REPLACE PACKAGE UTILITY_METHODS IS

TYPE STRING_TAB IS TABLE OF VARCHAR2(512) INDEX BY BINARY_INTEGER;

FUNCTION SPLIT_STR(  P_STRING        IN VARCHAR2
                   , P_SEPRATOR_CHAR IN VARCHAR2)
RETURN STRING_TAB;

END UTILITY_METHODS;

CREATE OR REPLACE PACKAGE BODY UTILITY_METHODS IS

FUNCTION SPLIT_STR(  P_STRING        IN VARCHAR2
                   , P_SEPRATOR_CHAR IN VARCHAR2)
RETURN STRING_TAB
IS
  STR_TAB STRING_TAB;
  L_SEP_CHAR VARCHAR2(1) := NVL(P_SEPRATOR_CHAR, ',');
  L_PATERN VARCHAR2(10)  := '[^' || L_SEP_CHAR || ']+';
BEGIN
  IF P_STRING IS NULL THEN
    RETURN STR_TAB;
  END IF;

  FOR RC IN (
              WITH L_LINE(STR) AS    
              (
                SELECT P_STRING
                FROM DUAL
              )
              SELECT REGEXP_SUBSTR(STR, L_PATERN, 1, LEVEL) SP_STR
              FROM L_LINE
              CONNECT BY LEVEL <= REGEXP_COUNT(STR, L_SEP_CHAR) + 1
            )
  LOOP
    STR_TAB(STR_TAB.COUNT) := RC.SP_STR;  
  END LOOP;

  RETURN STR_TAB;
END;  

END UTILITY_METHODS;

如果要在select语句中使用此函数,可以将函数的返回类型更改为PIPE_LINED。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47521099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档