Tech/DB・SQL
How to parse comma delimited string in PL/SQL
Enrai
2016. 1. 14. 19:05
이를 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으로 보내는게 맘에 들지 않을 경우, 이런 방법도 있다.