도쿄사는 외노자

How to parse comma delimited string in PL/SQL 본문

Tech/DB・SQL

How to parse comma delimited string in PL/SQL

Enrai 2016. 1. 14. 19:05

List를 콤마로 구분한 String으로 만들어,

이를 VARCHAR2 Parameter로 Oracle Stored Procedure로 전송하였다.


이제는 이를 Procedure내에서 파싱할 차례.


i_cdDataList라는 이름으로 해당 String을 받아왔다.

이를 커서에 넣어서 LOOP로 돌리기로 하였고,

결론적으론 CD_DATA라는 이름으로 데이터를 뽑아낼 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- データリスト
  CURSOR CUR_CD_DATA_LIST IS
    SELECT
        CD_DATA                                                                       -- データ
    FROM (
        SELECT
            TRIM (REGEXP_SUBSTR (CD_DATA_LIST'[^,]+'1, LEVEL)) AS CD_DATA
        FROM (
            SELECT
                i_cdDataList AS CD_DATA_LIST                                      -- データリスト
            FROM
                DUAL
        )
        CONNECT BY
            LEVEL <= regexp_count (CD_DATA_LIST','1+ 1
    )
    WHERE
        CD_DATA IS NOT NULL
    ;
 
    REC_CD_DATA_LIST               CUR_CD_DATA_LIST%ROWTYPE;
 
cs


당장 프로시저를 돌려서 확인할 수는 없는 노릇이라

일단 SELECT문만 떼서 돌려 보았다.


테스트 데이터는

'aaaaaaaaa,bbbbbbbbbbbbbbb,cccccccccc,ddddddddddddd,eeeeeeeee'

이다.





실제 커서를 돌릴 때의 코드는 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
PROCEDURE CHK_CD_DATA_LIST
IS
BEGIN
  -- 対象外フラグの初期化
  g_fgNoData      := 0;
 
  -- CURSOR CUR_CD_DATA_LISTをOPENする
  OPEN CUR_CD_DATA_LIST;
 
  -- LOOPを回し、データを分別する
  LOOP
 
    FETCH
        CUR_DATA_LIST
    INTO
        REC_DATA_LIST
    ;
 
    -- 繰り返し終了
    EXIT WHEN CUR_CD_DATA_LIST%NOTFOUND;
 
    /* パラメータ設定 */
    g_cdData := REC_CD_DATA_LIST.CD_DATA;
 
    -- データが一致するか確認
    IF g_cdData <> g_ifData THEN
 
       -- 入ってなかったら対象外フラグを"1"にする
       g_fgNoData      := 1;
    
    END IF;
 
  -- LOOP終わり
  END LOOP;
 
  -- カーソルクローズ
  CLOSE CUR_CD_DATA_LIST;
 
END CHK_CD_DATA_LIST;
cs


간단히 내용을 설명하자면,

커서를 돌리기 전, 프로시저의 다른 부분에서 SELECT문을 돌려 g_ifData에 값을 받아온다.

g_ifData와, 커서를 돌려 나온 g_cdData를 비교하여,

일치하지 않을 경우 대상외플래그(g_fgNoData)를 세운다.


String으로 보내는게 맘에 들지 않을 경우, 이런 방법도 있다.

'Tech > DB・SQL' 카테고리의 다른 글

테이블 복사 쿼리  (0) 2016.06.28
OUTPUT Clause (SQL Server)  (0) 2016.03.29
A5M2를 이용한 데이터 입력  (0) 2016.01.07
MSSQL에서의 CONVERT Function 사용  (0) 2016.01.06
Oracle Database Link  (0) 2015.12.02