| CREATE OR REPLACE PROCEDURE COMMA_TO_TOKEN
(
TEXT_BUFFER IN VARCHAR2
,CNT OUT BINARY_INTEGER
,CSV_DATA OUT DBMS_UTILITY.UNCL_ARRAY
)
/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
MAX_CNT NUMBER := 3;
ABORT_CNT NUMBER;
POINT_1 NUMBER;
POINT_2 NUMBER;
BUF_LEN NUMBER;
D1 VARCHAR2(1) := ',';
FIRST_FLG BOOLEAN;
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
CNT := 1;
FIRST_FLG := TRUE;
BUF_LEN := LENGTH(TEXT_BUFFER);
POINT_1 := 0;
LOOP
-- EXIT WHEN CNT > MAX_CNT;
-- EXIT WHEN POINT_1 > 2000;
EXIT WHEN POINT_1 > BUF_LEN;
IF D1 = SUBSTR(TEXT_BUFFER,POINT_1,1) OR FIRST_FLG THEN
POINT_2 := POINT_1 + 1;
ABORT_CNT := 0;
LOOP
EXIT WHEN
D1 = SUBSTR(TEXT_BUFFER,POINT_2,1)
or POINT_2 > BUF_LEN;
EXIT WHEN
ABORT_CNT > 100;
POINT_2 := POINT_2 + 1;
ABORT_CNT := ABORT_CNT + 1;
END LOOP;
IF POINT_1 + 1 = POINT_2 THEN
/* カンマが連続する場合は NULL がセットされます */
CSV_DATA(CNT) := NULL;
ELSE
CSV_DATA(CNT)
:= SUBSTR(
TEXT_BUFFER,
POINT_1+1,
POINT_2-POINT_1-1
);
END IF;
CNT := CNT + 1;
IF FIRST_FLG THEN
FIRST_FLG := FALSE;
END IF;
POINT_1 := POINT_2 - 1;
END IF;
POINT_1 := POINT_1 + 1;
END LOOP;
CNT := CNT - 1;
/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
| |