복붙노트

[SQL] dbms_utility.comma_to_table에 " 'XX.YY'무효 근처의 쉼표로 구분 된 목록"점점

SQL

dbms_utility.comma_to_table에 " 'XX.YY'무효 근처의 쉼표로 구분 된 목록"점점

STR : = 'ac_Abc.88, ac_Abc.99, ac_Abc.77'이 같은 문자열을 가지고있다. 나는 쉼표 (,)로 분리 한 후 첫 번째 요소를 얻을 필요가있다. 그래서 다음과 같이 사용하여 메신저 :

str VARCHAR2(500);
dbms_utility.comma_to_table
      ( list   => regexp_replace(str,'(^|,)','\1')
      , tablen => l_count
      , tab    => l_array
     ); 

나는 다음과 같은 오류를 받고 있어요 :

ORA-20001: comma-separated list invalid near bc.88
ORA-06512: at "SYS.DBMS_UTILITY", line 239
ORA-06512: at "SYS.DBMS_UTILITY", line 272

나는 다음과 같은 문자열이있는 경우 그러나, STR : = 'ac_Abc88, ac_Abc99, ac_Abc77', 잘 작동하고 나에게주는 동일한 방법으로 결과를 예상했다.

이 같아요 그래서 뭔가 필요가 고려하는 보정합니다 "." 일반 문자로. 당신은 내가이 문제를 해결하는 방법을 제안 해주십시오 수 있습니다.

해결법

  1. ==============================

    1.행으로 쉼표로 구분 된 문자열을 분할하는 방법을 참조하십시오

    행으로 쉼표로 구분 된 문자열을 분할하는 방법을 참조하십시오

    1. REGEXP_SUBSTR 접근

    SQL> WITH DATA AS(
      2  SELECT 'ac_Abc.88,ac_Abc.99,ac_Abc.77' str FROM dual)
      3  SELECT regexp_substr(str,'[^,]+',1,level) str
      4  FROM DATA
      5    CONNECT BY regexp_substr(str, '[^,]+', 1, level) IS NOT NULL
      6  /
    
    STR
    -----------------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    
    SQL>
    

    2. XML 접근 방식

    SQL> SELECT EXTRACT (VALUE (d), '//row/text()').getstringval () str
      2  FROM
      3    (SELECT XMLTYPE ( '<rows><row>'
      4      || REPLACE ('ac_Abc.88,ac_Abc.99,ac_Abc.77', ',', '</row><row>')
      5      || '</row></rows>' ) AS xmlval
      6    FROM DUAL
      7    ) x,
      8    TABLE (XMLSEQUENCE (EXTRACT (x.xmlval, '/rows/row'))) d
      9  /
    
    STR
    --------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    

    표 3. 함수

    SQL> CREATE TYPE test_type
      2  AS
      3    TABLE OF VARCHAR2(100)
      4  /
    
    Type created.
    
    SQL>
    SQL> CREATE OR REPLACE
      2  FUNCTION comma_to_table(
      3      p_list IN VARCHAR2)
      4    RETURN test_type
      5  AS
      6    l_string VARCHAR2(32767) := p_list || ',';
      7    l_comma_index PLS_INTEGER;
      8    l_index PLS_INTEGER := 1;
      9    l_tab test_type     := test_type();
     10  BEGIN
     11    LOOP
     12      l_comma_index := INSTR(l_string, ',', l_index);
     13      EXIT
     14    WHEN l_comma_index = 0;
     15      l_tab.EXTEND;
     16      l_tab(l_tab.COUNT) := SUBSTR(l_string, l_index, l_comma_index - l_index);
     17      l_index            := l_comma_index                           + 1;
     18    END LOOP;
     19    RETURN l_tab;
     20  END comma_to_table;
     21  /
    
    Function created.
    
    SQL> sho err
    No errors.
    SQL>
    SQL> SELECT * FROM TABLE(comma_to_table('ac_Abc.88,ac_Abc.99,ac_Abc.77'))
      2  /
    
    COLUMN_VALUE
    --------------------------------------------------------------------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    
    SQL>
    

    4. 파이프 라인 기능

    SQL> CREATE OR REPLACE
      2    FUNCTION comma_to_table(
      3        p_list IN VARCHAR2)
      4      RETURN test_type PIPELINED
      5    AS
      6      l_string LONG := p_list || ',';
      7      l_comma_index PLS_INTEGER;
      8      l_index PLS_INTEGER := 1;
      9    BEGIN
     10      LOOP
     11        l_comma_index := INSTR(l_string, ',', l_index);
     12        EXIT
     13      WHEN l_comma_index = 0;
     14        PIPE ROW ( SUBSTR(l_string, l_index, l_comma_index - l_index) );
     15        l_index := l_comma_index                           + 1;
     16      END LOOP;
     17      RETURN;
     18    END comma_to_table;
     19    /
    
    Function created.
    
    SQL> sho err
    No errors.
    SQL>
    SQL> SELECT * FROM TABLE(comma_to_table('ac_Abc.88,ac_Abc.99,ac_Abc.77'))
      2  /
    
    COLUMN_VALUE
    --------------------------------------------------------------------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    
  2. ==============================

    2.이 때문에 (오라클 문서 참조)

    이 때문에 (오라클 문서 참조)

    A "이름은"여기에 언급 된 모든 이름 지정 규칙이 적용되는 유효한 오라클 (DB 객체) 식별자입니다. 오라클은 숫자로 시작하는 식별자를 가질 수 없기 때문에 ac_Abc.88는 유효한 이름이 아닙니다.

    쉼표로 구분 된 값의 문자열을 구문 분석하여 문제를 해결하려면 더 그랜드 쿠마 B의의 솔루션을 사용합니다.

  3. from https://stackoverflow.com/questions/26273042/getting-comma-separated-list-near-xx-yy-invalid-with-dbms-utility-comma-to-t by cc-by-sa and MIT license