[SQL] dbms_utility.comma_to_table에 " 'XX.YY'무효 근처의 쉼표로 구분 된 목록"점점
SQLdbms_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. 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.이 때문에 (오라클 문서 참조)
이 때문에 (오라클 문서 참조)
A "이름은"여기에 언급 된 모든 이름 지정 규칙이 적용되는 유효한 오라클 (DB 객체) 식별자입니다. 오라클은 숫자로 시작하는 식별자를 가질 수 없기 때문에 ac_Abc.88는 유효한 이름이 아닙니다.
쉼표로 구분 된 값의 문자열을 구문 분석하여 문제를 해결하려면 더 그랜드 쿠마 B의의 솔루션을 사용합니다.
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
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 : DATABASE를 생성에 사용되는 매개 변수 (0) | 2020.05.27 |
---|---|
[SQL] SQL 서버 ID 열 값은 0에서 시작하는 대신 1 (0) | 2020.05.27 |
[SQL] 다수의 열 값으로 나누어 하나의 열 값 (0) | 2020.05.27 |
[SQL] 집계 (X, Y)에서의 PostgreSQL 점군 좌표 (0) | 2020.05.27 |
[SQL] 위한 SQL 구문 용어 WHERE (COL1, COL2) <(VAL1, val2만큼) ' (0) | 2020.05.27 |