FC2ブログ
プログラム研究所
ソフトウェア開発やプログラミングの豆知識を載せています。
09 | 2018/10 | 11
S M T W T F S
- 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 - - -

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CSVデータの分割
PL/SQLでユーザが入力したデータや、他のプログラムモジュールとのインタフェースのためにCSVデータを取り扱うことがあります。ここではソースのCSVデータを文字列の配列に分解する一般的なルーチンを紹介します。まずは引用符によるエスケープなどを考慮しなくて良い単純なカンマ区切りの分割です。データに区切り文字や引用符などが含まれておりそれらのエスケープも考慮しなければならない場合は、本稿のプログラムを改良してそれらの状況に対処できるようにする必要があります。

CSVデータの分割

プロシージャ仕様

プロシージャ名
CSV_TO_TABLE
入力データ
IN_CSV VARCHAR2;
出力データ
OUT_ITEMS CSV_TABLE;
出力データの型
TYPE CSV_TABLE IS TABLE OF VARCHAR2(32767) INDEX BY PLS_INTEGER;
例外
Oracleエラーなどが発生した場合はアプリケーション例外をスローします。

プロシージャ定義

PROCEDURE CSV_TO_TABLE(IN_CSV IN VARCHAR2, OUT_ITEMS OUT CSV_TABLE) IS ITEMS CSV_TABLE; -- 作業用のリスト COUNT PLS_INTEGER; -- 項目数 CSVLEN PLS_INTEGER; -- CSV長 POSCUR PLS_INTEGER; -- CSV中の検索位置 POSSEP PLS_INTEGER; -- 区切文字の位置 P_SEPARATER VARCHAR2(1) := ','; -- 区切文字 BEGIN ------------------------- -- 作業用リストの初期化 ------------------------- ITEMS.DELETE; COUNT := 0; ----------------------------------- -- CSVが空の場合 1番目の項目が空値 ----------------------------------- IF IN_CSV IS NULL OR LENGTH(IN_CSV) = 0 THEN COUNT := 1; ITEMS(COUNT) := NULL; ------------------------------ -- CSVが空でない場合 項目分割 ------------------------------ ELSE ------------------ -- ポインタ初期化 ------------------ CSVLEN := LENGTH(IN_CSV); POSCUR := 1; ---------- -- ループ ---------- WHILE (POSCUR <= CSVLEN) LOOP -- セパレータを探す POSSEP := INSTR( IN_CSV, P_SEPARATER, POSCUR, 1 ); -- テーブルに値をセットする COUNT := COUNT + 1; IF POSSEP = 0 THEN ITEMS(COUNT) := SUBSTR(IN_CSV, POSCUR, CSVLEN - POSCUR + 1); POSCUR := CSVLEN + 1; ELSE ITEMS(COUNT) := SUBSTR(IN_CSV, POSCUR, POSSEP - POSCUR); POSCUR := POSSEP + 1; END IF; END LOOP; ---------------------------------------------------------- -- 最後の文字がセパレータの場合、テーブルに空値を追加する ---------------------------------------------------------- IF SUBSTR(IN_CSV, CSVLEN, 1) = P_SEPARATER THEN COUNT := COUNT + 1; ITEMS( COUNT ) := NULL; END IF; END IF; -------------- -- 出力リスト -------------- OUT_ITEMS := ITEMS; ITEMS.DELETE; RETURN; EXCEPTION WHEN OTHERS THEN ITEMS.DELETE; RAISE_APPLICATION_ERROR(-20999, '例外:' || SQLERRM, TRUE); END;

使い方の例

DECLARE CSV_DATA VARCHAR2(2000); CSV_ITEMS CSV_TABLE I PLS_INTEGER; BEGIN -- テーブルやファイルから CSVデータ を読み込む。 SELECT CSV_DATA_COLUMN INTO CSV_DATA FROM TABLE_SOURCE; -- 項目リストに分割する。 CSV_TO_TABLE ( CSV_DATA, CSV_ITEMS ); -- 各項目の処理をする FOR I IN 1..CSV_ITEMS.COUNT LOOP DBMS_OUTPUT.PUT_LINE( CSV_ITEMS(I) ); END LOOP; -- リストの破棄 CSV_ITEMS.DELETE; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( SQLERRM ); END;
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿














管理者にだけ表示を許可する


トラックバック
トラックバック URL
http://proglabo.blog.fc2.com/tb.php/4-97e72ad5
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。