sql >> データベース >  >> RDS >> Oracle

ストアドプロシージャを使用してOracleテーブルにCSVファイルをインポートする

    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日付データ形式に従って、日付フィールドの日付形式も処理します。

    1. 行の目標、パート4:アンチ結合アンチパターン

    2. MySQLGROUPBYの動作

    3. PostgreSQLでの数値フォーマット用のテンプレートパターンと修飾子

    4. SQLServer-行をコンマ区切りのリストに結合します