Oracle에서 구분 된 문자열을 행으로 분할

하산 굴 자르

Oracle로 변환 할 수 있는지 확인해야하는 쿼리가 있습니다.

WITH Cte
     AS (SELECT cast('<S>' + replace(replace(N'$(AppServers)', ';', ','), ',', '</S><S>') + '</S>' AS XML) AS Servers)
INSERT INTO INSTANCE
            (INSTANCE_ID,
             SERVER_NAME,
             INSTANCE_IDENTIFIER,
             IDENTIFIER_PREFIX)
SELECT ROW_NUMBER() OVER (ORDER BY SERVER_NAME) - 1,
       SERVER_NAME,
       NULL,
       0
FROM   (SELECT DISTINCT upper(Split.Server.value('.', 'VARCHAR(100)')) AS SERVER_NAME
        FROM   Cte
               CROSS apply Servers.nodes('/S') Split(Server)) Servers
ORDER  BY SERVER_NAME; 

Oracle 11g가 XML을 전담 지원한다는 것을 알고 있지만이 문제를 해결할 방법을 찾을 수 없습니다. 어떤 도움이라도 대단히 감사합니다.

위의 쿼리 $(AppServers)는가로 바뀌면 다음을 삽입합니다 foo,bar;baz,wibble.

+-------------+-------------+---------------------+-------------------+
| INSTANCE_ID | SERVER_NAME | INSTANCE_IDENTIFIER | IDENTIFIER_PREFIX |
+-------------+-------------+---------------------+-------------------+
|           0 | BAR         | NULL                |                 0 |
|           1 | BAZ         | NULL                |                 0 |
|           2 | FOO         | NULL                |                 0 |
|           3 | WIBBLE      | NULL                |                 0 |
+-------------+-------------+---------------------+-------------------+

XML 코드는 구분 된 (쉼표 또는 세미콜론으로) 문자열을 행으로 분할하기위한 것입니다. 그런 다음 값은 대문자로 표시되고 중복 항목이 제거 된 다음 알파벳순으로 정렬되어 Instance_Id를 가져옵니다.

하산 굴 자르

dbforums.com의 @LKBrwn_DBA가 이에 대한 해결책을 마련했습니다.

CREATE OR REPLACE TYPE Csvparserreturn AS TABLE OF VARCHAR2 ( 4000 );
/

CREATE OR REPLACE FUNCTION Csvparser ( P_Dat IN CLOB, P_Hdr IN VARCHAR2 )
   RETURN Csvparserreturn
AS
   L_Debug        CHAR ( 1 ) := 'F';
   L_Hdr          VARCHAR2 ( 4000 );
   L_Dat          CLOB;
   L_Wrk          CLOB;
   L_Recsep       CHAR ( 1 ) := CHR ( 9 );

   O_Hdr          VARCHAR2 ( 4000 );
   O_Dat          CLOB;
   O_Data_Tab     Csvparserreturn := Csvparserreturn ( );

   TYPE Text_Array IS TABLE OF VARCHAR2 ( 4000 )
      INDEX BY PLS_INTEGER;

   L_Hdr_Array    Text_Array;
   L_Dat_Array    Text_Array;
   L_Fld_Array    Text_Array;
   L_Elm_Array    Text_Array;
   L_Val_Array    Text_Array;
   L_Hdr_Count    PLS_INTEGER;
   L_Dat_Count    PLS_INTEGER;
   L_Fld_Count    PLS_INTEGER;
   I              PLS_INTEGER;
   J              PLS_INTEGER;
   K              PLS_INTEGER;
   L              PLS_INTEGER;
   N              PLS_INTEGER;

   PROCEDURE Print_Line ( P_Text VARCHAR2 )
   IS
   BEGIN
      IF L_Debug = 'T'
      THEN
         DBMS_OUTPUT.Put_Line ( P_Text );
      END IF;
   END;

   FUNCTION Parse_Csv ( P_Text CLOB, P_Delim VARCHAR2 DEFAULT ',' )
      RETURN Text_Array
   IS
      Wk_Array       Text_Array;
   BEGIN
      N           := 1;
      L           := 1;
      K           := 1;

      WHILE 1 = 1
      LOOP
         L           := INSTR ( SUBSTR ( P_Text || P_Delim, K + 1 )
                              , P_Delim );
         EXIT WHEN K >= LENGTH ( P_Text );
         Wk_Array ( N ) := SUBSTR ( P_Text, K, L );
         N           := N + 1;
         K           := K + L + 1;
      END LOOP;

      RETURN Wk_Array;
   END;
BEGIN
   L_Hdr       := P_Hdr;
   L_Dat       := P_Dat;
   L_Hdr_Array := Parse_Csv ( L_Hdr );
   L_Hdr_Count := L_Hdr_Array.COUNT;
   Print_Line ( 'Hdr#' || L_Hdr_Count );
   O_Hdr       := '';

   FOR I IN 1 .. L_Hdr_Count
   LOOP
      O_Hdr       := O_Hdr || L_Hdr_Array ( I ) || L_Recsep;
      Print_Line ( 'Elm#' || I || ': ' || L_Hdr_Array ( I ) );
   END LOOP;

   L_Wrk       := SUBSTR ( L_Dat, 2, LENGTH ( L_Dat ) - 2 );

   SELECT REPLACE ( L_Wrk, '),(', L_Recsep ) || L_Recsep INTO L_Wrk FROM DUAL;

   Print_Line ( 'Dat: ' || L_Wrk );

   L_Dat_Array := Parse_Csv ( L_Wrk, L_Recsep );
   L_Dat_Count := L_Dat_Array.COUNT;


   O_Data_Tab.EXTEND;
   O_Data_Tab ( 1 ) := O_Hdr;

   FOR I IN 1 .. L_Dat_Count
   LOOP
      L_Fld_Array := Parse_Csv ( L_Dat_Array ( I ) );
      L_Fld_Count := L_Fld_Array.COUNT;
      Print_Line ( 'Rec#' || I || ': ' || L_Dat_Array ( I ) || ' Flds:' || L_Fld_Count );

      O_Dat       := '';

      FOR J IN 1 .. L_Hdr_Count
      LOOP
         K           := 0;

         FOR N IN 1 .. L_Fld_Count
         LOOP
            IF L_Hdr_Array ( J ) =
                  SUBSTR ( L_Fld_Array ( N )
                         , 1, LENGTH ( L_Hdr_Array ( J ) ) )
            THEN
               K           := N;
               CONTINUE;
            END IF;
         END LOOP;

         IF K > 0
         THEN
            L           := INSTR ( L_Fld_Array ( K ), '=' );
            L_Elm_Array ( J ) := SUBSTR ( L_Fld_Array ( K ), 1, L - 1 );
            L_Val_Array ( J ) := SUBSTR ( L_Fld_Array ( K ), L + 1 );
         ELSE
            L_Elm_Array ( J ) := '#N/A';
            L_Val_Array ( J ) := '#N/A';
         END IF;

         Print_Line ( 'Element ' || TO_CHAR ( J ) || '.' || L_Hdr_Array ( J ) || '=' || L_Val_Array ( J ) );

         O_Dat       := O_Dat || L_Val_Array ( J ) || L_Recsep;
      END LOOP;

      Print_Line ( 'Out#' || TO_CHAR ( I ) || '=' || O_Dat );

      O_Data_Tab.EXTEND;
      O_Data_Tab ( I + 1 ) := O_Dat;
   END LOOP;

   RETURN O_Data_Tab;
END;
/

사용법은 다음과 같습니다.

DECLARE
   Out_Data  Csvparserreturn := Csvparserreturn ( );
   X_Hdr     VARCHAR2 ( 4000 ) := 'Directory,ID,Location,UserName,Password,Selector';
   X_Dat     CLOB := '(Directory=Voice Active Directory A,ID=VT-AD1,Location=Canada,UserName=admin,Password=passw0rd,Selector=AD1),(Directory=Voice Active Directory B,ID=VT-AD2,Location=https://beta-proxy.voice.com/VTadp/Proxy/[/url],UserName=admin,Password=passw0rd,Selector=AD2),(Directory=Voice Active Directory C,ID=VT-AD3,Location=https://final-proxy.voice.com/VTadp/Proxy/,UserName=admin,Password=passw0rd)';
BEGIN
   Out_Data    := Csvparser ( X_Dat, X_Hdr );

   FOR I IN Out_Data.FIRST .. Out_Data.LAST
   LOOP
      DBMS_OUTPUT.Put_Line ( 'Rec# ' || TO_CHAR ( I, 'FM000.' ) || Out_Data ( I ) );
   END LOOP;
END;
/

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Oracle에서 쉼표로 구분 된 문자열을 분할하는 방법

분류에서Dev

구분 된 문자열을 Oracle의 행으로 변환

분류에서Dev

Python Pandas : 두 개 이상의 열에서 슬래시로 구분 된 문자열을 여러 행으로 분할

분류에서Dev

콜론으로 구분 된 문자열을 배열로 분할

분류에서Dev

SQL에서 쉼표로 구분 된 문자열 분할

분류에서Dev

/ bin / sh에서 새 줄로 구분 된 문자열을 분할하는 방법

분류에서Dev

모든 행에 대해 R에서 쉼표로 구분 된 문자열 분할

분류에서Dev

쉼표로 구분 된 문자열을 부울 열로 분할

분류에서Dev

여러 구분 기호로 정의 된 문자열 부분을 R에서 여러 변수로 분할

분류에서Dev

Hive-여러 행으로 구분 된 열 분할, 위치에 따라 선택

분류에서Dev

목록 값을 쉼표로 구분 된 문자열로 분할

분류에서Dev

목록 값을 쉼표로 구분 된 문자열로 분할

분류에서Dev

쉼표로 구분 된 문자열을 R에서 정의 된 개수로 분할

분류에서Dev

SQL Server에서 조인을 사용하여 열로 선택하여 쉼표로 구분 된 문자열 분할?

분류에서Dev

SQL Server에서 조인을 사용하여 열로 선택하여 쉼표로 구분 된 문자열 분할?

분류에서Dev

문자열을 [시작 문자로,]를 쉼표로 구분 된 끝 문자로 파이썬에서 두 목록으로 분할

분류에서Dev

열에서 반환 된 문자열을 정수로 분할

분류에서Dev

Pandas에서 행을 파이프로 구분 된 열로 분할하는 방법

분류에서Dev

Bash에서 여러 문자 구분 기호로 분할 된 문자열의 특정 부분 제거

분류에서Dev

쉼표로 구분 된 문자열에서 성, 이름 구분

분류에서Dev

구분 된 문자열 "# | #"로 문자열을 분할하는 방법

분류에서Dev

쉼표로 구분 된 문자열을 분할하고 C #에서 따옴표 추가-우아한 솔루션

분류에서Dev

LINQ를 사용하여 그룹에서 쉼표로 구분 된 문자열을 분할하는 방법

분류에서Dev

문자열에서 이중으로 잘못된 구문 분석

분류에서Dev

가능한 모든 순서가 지정된 구문으로 문자열 분할

분류에서Dev

C ++에서 공백으로 구분 된 문자열을 벡터로 읽기

분류에서Dev

분할에 사용 된 동일한 구분 기호로 문자열 결합

분류에서Dev

구분 된 여러 값을 여러 행으로 분할

분류에서Dev

정규식을 사용하여 문자열을 분할 할 때 쉼표로 구분 된 문자열에서 공백을 건너 뜁니다.

Related 관련 기사

  1. 1

    Oracle에서 쉼표로 구분 된 문자열을 분할하는 방법

  2. 2

    구분 된 문자열을 Oracle의 행으로 변환

  3. 3

    Python Pandas : 두 개 이상의 열에서 슬래시로 구분 된 문자열을 여러 행으로 분할

  4. 4

    콜론으로 구분 된 문자열을 배열로 분할

  5. 5

    SQL에서 쉼표로 구분 된 문자열 분할

  6. 6

    / bin / sh에서 새 줄로 구분 된 문자열을 분할하는 방법

  7. 7

    모든 행에 대해 R에서 쉼표로 구분 된 문자열 분할

  8. 8

    쉼표로 구분 된 문자열을 부울 열로 분할

  9. 9

    여러 구분 기호로 정의 된 문자열 부분을 R에서 여러 변수로 분할

  10. 10

    Hive-여러 행으로 구분 된 열 분할, 위치에 따라 선택

  11. 11

    목록 값을 쉼표로 구분 된 문자열로 분할

  12. 12

    목록 값을 쉼표로 구분 된 문자열로 분할

  13. 13

    쉼표로 구분 된 문자열을 R에서 정의 된 개수로 분할

  14. 14

    SQL Server에서 조인을 사용하여 열로 선택하여 쉼표로 구분 된 문자열 분할?

  15. 15

    SQL Server에서 조인을 사용하여 열로 선택하여 쉼표로 구분 된 문자열 분할?

  16. 16

    문자열을 [시작 문자로,]를 쉼표로 구분 된 끝 문자로 파이썬에서 두 목록으로 분할

  17. 17

    열에서 반환 된 문자열을 정수로 분할

  18. 18

    Pandas에서 행을 파이프로 구분 된 열로 분할하는 방법

  19. 19

    Bash에서 여러 문자 구분 기호로 분할 된 문자열의 특정 부분 제거

  20. 20

    쉼표로 구분 된 문자열에서 성, 이름 구분

  21. 21

    구분 된 문자열 "# | #"로 문자열을 분할하는 방법

  22. 22

    쉼표로 구분 된 문자열을 분할하고 C #에서 따옴표 추가-우아한 솔루션

  23. 23

    LINQ를 사용하여 그룹에서 쉼표로 구분 된 문자열을 분할하는 방법

  24. 24

    문자열에서 이중으로 잘못된 구문 분석

  25. 25

    가능한 모든 순서가 지정된 구문으로 문자열 분할

  26. 26

    C ++에서 공백으로 구분 된 문자열을 벡터로 읽기

  27. 27

    분할에 사용 된 동일한 구분 기호로 문자열 결합

  28. 28

    구분 된 여러 값을 여러 행으로 분할

  29. 29

    정규식을 사용하여 문자열을 분할 할 때 쉼표로 구분 된 문자열에서 공백을 건너 뜁니다.

뜨겁다태그

보관