カンマ区切りを分解するプロシージャ

  COMMA_TO_TOKEN



DBMS_UTILITY.COMMA_TO_TABLE だと、識別子のリストしか実行できないので
いろいろ制限があります。

インターフェイスを同じにしてみました。



DBMS_UTILITY.UNCL_ARRAY の Oracle ドキュメントへのリンク

( ※ TYPE uncl_array IS TABLE OF VARCHAR2(227) INDEX BY BINARY_INTEGER; )

  
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;
  


↓実行サンプルコード
  
DECLARE 
	WK_TEXT VARCHAR2(4000);
	WK_LEN BINARY_INTEGER;
	WK_ARRAY DBMS_UTILITY.UNCL_ARRAY;
BEGIN 
	WK_TEXT := 'ああああああああ,2,';
	/* プロシージャ */ 
	COMMA_TO_TOKEN(WK_TEXT,WK_LEN,WK_ARRAY); 

	DBMS_OUTPUT.PUT_LINE(WK_LEN);

	FOR i IN 1..WK_LEN LOOP 
		DBMS_OUTPUT.PUT_LINE('|' || WK_ARRAY(i) || '|');
	END LOOP;
END; 
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ