CSVファイルは、フィールドがコンマで区切られたコンマ区切りファイルです。この記事では、ストアドプロシージャを使用してCSVファイルをOracleテーブルにインポートする例を示します。 Oracleのストアドプロシージャは、スタンドアロンまたはデータベースパッケージのPL/SQLプログラムユニットです。
ファイルが格納されているサーバーパスを参照するディレクトリオブジェクトがOracleデータベースに存在する必要があります。以下の例では、ディレクトリオブジェクト名をCSV_DIRとして使用しており、プロシージャ名はread_csvです。また、プロシージャread_csvに関数GetStringを作成して、区切られた文字列を1つずつ取得します 。
PL/SQLプロシージャを使用したCSVファイルのOracleテーブルへのロード
CREATE OR REPLACE PROCEDURE read_csv IS l_file_type UTL_FILE.file_type; l_string VARCHAR2 (32765); TYPE Fieldvalue IS TABLE OF VARCHAR2 (4000) INDEX BY BINARY_INTEGER; t_field Fieldvalue; FUNCTION GetString (Source_string IN VARCHAR2, Field_position IN NUMBER, UnTerminated IN BOOLEAN DEFAULT FALSE, Delimiter IN VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS iPtrEnd PLS_INTEGER := 0; iPtrStart PLS_INTEGER := 0; vcSourceStrCopy VARCHAR2 (4000) := Source_string; BEGIN IF UnTerminated THEN vcSourceStrCopy := vcSourceStrCopy || Delimiter; END IF; IF Field_Position > 1 THEN iPtrStart := INSTR (vcSourceStrCopy, Delimiter, 1, Field_Position - 1) + LENGTH (Delimiter); ELSE iPtrStart := 1; END IF; iPtrEnd := INSTR (vcSourceStrCopy, Delimiter, 1, Field_Position); RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart)); END GetString; BEGIN l_file_type := UTL_FILE.Fopen ('CSV_DIR', 'abc.csv', 'r'); LOOP UTL_FILE.Get_Line (l_file_type, l_string); l_string := l_string || ','; FOR n IN 1 .. REGEXP_COUNT (l_string, ',') LOOP t_field (n) := Getstring (l_string, n, FALSE, ','); END LOOP; INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (t_field (1), t_field (2), t_field (3), t_field (4), TO_DATE (t_field (5), 'dd/mm/yyyy'), t_field (6), t_field (7), t_field (8)); END LOOP; UTL_FILE.Fclose (l_file_type); COMMIT; EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open (l_file_type) THEN UTL_FILE.Fclose (l_file_type); END IF; END;
ターゲットテーブルを正しくマップするには、CSVファイルを調べる必要があることに注意してください。 CSV日付データ形式に従って、日付フィールドの日付形式も処理します。