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

Oracle PL/SQLでのCSVファイルの読み取りとインポート

    PLSQLでCSVファイル(カンマ区切り)を読み取ってインポートする例を以下に示します。カンマ(または任意の区切り文字)区切りファイルの読み取りとインポートに使用するOracleフォーム「D2k_Delimited_String」にパッケージがあります。このパッケージで区切りファイルを読み取るための投稿をOracle Formsにも書き込みました。以下は、リンクhttps:/です。 /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html。 PLSQLでCSVファイルを効率的に読み取るためにデータベースパッケージに変換したのと同じパッケージで、パッケージの名前を「Plsql_Delimited_String」に変更しました。以下は、このパッケージ関数Get_Stringを使用してplSQLにcsvファイルをインポートするための例です。この関数の使用法は次のとおりです。

    Plsql_Delimited_String.Getstring([区切りテキストを含む文字列、行全体]、
    [occurance]、
    [unterminated boolean default false]、
    [delimeter]);

    次の手順では、ユーザーはOracleディレクトリオブジェクトで作成されたディレクトリの場所にあるはずのファイル名を渡します。この例では、ディレクトリオブジェクト「YOUR_DIRECTORY」を使用し、ディレクトリオブジェクトで変更して、その場所に区切られたファイルをコピーしてから渡します。このプロシージャのファイル名。

    作成または置換手順Import_Emp_File(P_FILENAME IN VARCHAR2、
    o_msg OUT VARCHAR2)
    IS
    Infile UTL_FILE.File_Type;
    Linebuf VARCHAR2(4000);
    V_Getstring VARCHAR2(100 );

    --フィールド値配列
    TYPEフィールド値はVARCHAR2(100)のテーブルです
    INDEX BY BINARY_INTEGER;

    Field_Position Fieldvalue;

    Total_Rec_Count NUMBER:=0;
    Total_Rec_Processed NUMBER:=0;
    BEGIN
    Infile:=UTL_FILE.Fopen('YOUR_DIRECTORY'、P_FILENAME、'R');

    LOOP
    ---
    UTL_FILE.Get_Line(Infile、Linebuf);
    -すべてのフィールドを読み取るために行の終わりにパイプを追加します

    Linebuf:=Linebuf || '|';

    --ファイルにパイプ付きの6つの区切り文字列が含まれているとします(|)
    FOR I IN 1 .. 6
    LOOP
    Field_Position(I):=
    Plsql_Delimited_String.Getstring(Linebuf 、
    I、
    FALSE、
    '|');
    END LOOP;

    BEGIN
    Total_Rec_Count:=Total_Rec_Count + 1;

    -テーブルの例
    INSERTINTO EMP(EMPLOYEE_NUMBER、
    FIRST_NAME、
    LAST_NAME、
    DATE_OF_JOIN、
    EMP_TYPE、
    DATE_OF_REGN)
    VALUES (field_position(1)、
    field_position(2)、
    field_position(3)、
    field_position(4)、
    field_position(5)、
    field_position(6) );

    Total_Rec_Processed:=Total_Rec_Processed + 1;
    EXCEPTION
    WHEN OTHERS
    THEN
    -データベース挿入中のエラーを無視する
    NULL;
    END;
    ループの終了;

    IF UTL_FILE.is_open(infile)
    THEN
    UTL_FILE.Fclose(Infile);
    END IF;
    EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
    IF UTL_FILE.is_open(infile)
    THEN
    UTL_FILE.Fclose(Infile);
    END IF;

    IF total_rec_processed> 0
    THEN
    COMMIT;
    END IF;
    WHEN OTHERS
    THEN
    IF UTL_FILE.is_open(infile)
    THEN
    UTL_FILE.Fclose(Infile);
    END IF;

    o_msg:=SQLERRM;
    END;
    /以下は、この例で使用されているPLSQL_DELIMITED_STRINGのパッケージ・ソースです。このパッケージをスキーマにインストールしてください。このパッケージには、PLSQLを使用してcsvファイルを読み取るために使用できる他の多くのユーティリティ関数が含まれています。

    パッケージの作成または置換plsql_Delimited_StringIS

    function Counter(Source_string in varchar2、
    UnTerminated in Boolean default FALSE、
    Delimiter in varchar2 default'、')return number;
    Procedure PutString(Source_string in out varchar2、
    String_to_add in varchar2、
    Field_position in number、
    UnTerminated in Boolean default FALSE、
    Delimiter in varchar2 default'、');
    Procedure PutNumber(Source_string in out varchar2、
    number_to_add in number、
    Field_position in number、
    UnTerminated in Boolean default FALSE、
    Delimiter in varchar2 default'、');
    Procedure PutDate(Source_string in out varchar2、
    Date_to_add in date、
    Field_position in number、
    UnTerminated in Bo olean default FALSE、
    varchar2の区切り文字default'、');
    function GetString(Source_string in varchar2、
    Field_position in number、
    UnTerminated in Boolean default FALSE、
    varchar2のデフォルトの区切り文字'、')return varchar2;
    function GetNumber(varchar2のSource_string、
    numberのField_position、
    ブール値のデフォルトで終了していませんFALSE、
    varchar2のデフォルトの区切り文字'、 ')return number;
    function GetDate(Source_string in varchar2、
    Field_position in number、
    UnTerminated in Boolean default FALSE、
    Delimiter in varchar2 default'、')return date;
    function Locate(varchar2のSource_string、
    varchar2のSearch_String、
    Booleで終了していませんデフォルトはFALSE、
    varchar2の区切り文字デフォルト'、')return number;
    function Locate(Source_string in varchar2、
    Search_date in date、
    UnTerminated in Boolean default FALSE、
    varchar2defaultの区切り文字'、')return number;
    function Locate(varchar2のSource_string、
    Search_number in number、
    UnTerminated in Boolean default FALSE、
    Delimiter in varchar2 default '、')return number;
    END plsql_Delimited_String;
    /

    パッケージ本体の作成または置換plsql_Delimited_String
    IS
    FUNCTIONカウンター(Source_string IN VARCHAR2、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    RETURN NUMBER
    IS
    iModifier PLS_INTEGER:=0;
    iOldSize PLS_INTEGER:=LENGTH(Source_string);
    BEGIN
    IF Unterterminaled
    THEN
    iModifier: =1;
    END IF;

    RETURN(iOldSize-LENGTH(REPLACE(Source_string、Delimiter)))
    + iModifier;
    END Counter;

    PROCEDURE PutString(Source_string IN OUT VARCHAR2、
    String_to_add IN VARCHAR2、
    Field_position IN NUMBER、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    IS
    iStrLen PLS_INTEGER:=LENGTH(Source_String);
    iStrFragLen PLS_INTEGER:=LENGTH(String_to_add);
    iPtrStart PLS_INTEGER:=0;
    iPtrEnd PLS_INTEGER:=0;
    vcSepBuffer VARCHAR2(2000);
    iCounter PLS_INTEGER;
    BEGIN
    -1.文字列はゼロの長さですか?
    IF iStrLen =0
    THEN
    IF Field_Position> 1
    THEN
    FOR iCounter IN 2 .. Field_Position
    LOOP
    vcSepBuffer:=vcSepBuffer ||区切り文字;
    END LOOP;
    END IF;

    Source_string:=vcSepBuffer || String_to_add;

    終了していない場合
    その後
    Source_string:=Source_String ||区切り文字;
    iStrLen:=LENGTH(Source_string);
    END IF;
    ELSE
    -2.終了していない文字列に対処します
    IFUnTerminated
    THEN
    Source_string:=Source_string ||区切り文字;
    END IF;

    --3.n番目の1つの区切り文字を見つけます
    IFField_Position> 1
    THEN
    LOOP
    iPtrStart:=
    (INSTR(Source_string || vcSepBuffer、
    Delimiter、
    1、
    Field_Position-1)
    -1)
    + LENGTH(Delimiter);
    EXIT WHEN iPtrStart> 0;
    vcSepBuffer: =vcSepBuffer ||区切り文字;
    END LOOP;

    vcSepBufferがNULLでない場合
    THEN
    iPtrEnd:=iStrLen;
    ELSE
    iPtrEnd:=
    INSTR(Source_string、
    Delimiter、
    1 、
    Field_Position);

    IF iPtrEnd =0
    THEN
    iPtrEnd:=iStrLen;
    END IF;
    END IF;
    ELSE
    iPtrStart:=0;
    iPtrEnd:=
    INSTR(Source_string、
    Delimiter、
    1、
    Field_Position);

    IF iPtrEnd =0
    THEN
    iPtrEnd:=iStrLen;
    END IF;
    END IF;

    --3.文字列を再構築します
    Source_string:=
    SUBSTR(Source_string、1、iPtrStart)
    || vcSepBuffer
    || String_to_add
    ||区切り文字
    || SUBSTR(Source_string、iPtrEnd + LENGTH(区切り文字));

    --4.終了を整理します
    IFUnTerminated
    THEN
    Source_string:=
    SUBSTR(Source_String、
    1、
    (LENGTH(Source_string)-LENGTH (区切り文字)));
    END IF;
    END IF;
    END PutString;

    PROCEDURE PutNumber(Source_string IN OUT VARCHAR2、
    number_to_add IN NUMBER、
    Field_position IN NUMBER、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    IS
    BEGIN
    -1.データ型変換を実行し、putのvarchar2varsionを呼び出すだけです。
    plsql_Delimited_String.PutString(Source_string、
    TO_CHAR(number_to_add)、
    Field_position、
    UnTerminated、
    Delimiter);
    END PutNumber;

    PROCEDURE PutDate(Source_string IN OUT VARCHAR2、
    Date_to_add IN DATE、
    Field_position IN NUMBER、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    IS
    BEGIN
    -1.データ型変換を実行し、putのvarchar2varsionを呼び出すだけです。
    plsql_Delimited_String。
    PutString(Source_string、
    TO_CHAR(date_to_add、 ' DD-MON-YYYY HH24:MI:SS')、
    Field_position、
    UnTerminated、
    Delimiter);
    END PutDate;

    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(2000):=Source_string;
    BEGIN
    IF UnTerminated
    THEN
    vcSourceStrCopy:=vcSourceStrCopy ||区切り文字;
    END IF;

    IF Field_Position> 1
    THEN
    iPtrStart:=
    INSTR(vcSourceStrCopy、
    Delimiter、
    1、
    Field_Position-1)
    + LENGTH (区切り文字);
    ELSE
    iPtrStart:=1;
    END IF;

    iPtrEnd:=
    INSTR(vcSourceStrCopy、
    Delimiter、
    1、
    Field_Position);
    RETURN SUBSTR(vcSourceStrCopy、iPtrStart、(iPtrEnd --iPtrStart));
    END GetString; /*文字列バージョン*/

    FUNCTION GetNumber(Source_string IN VARCHAR2、
    Field_position IN NUMBER、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    RETURN NUMBER
    IS
    iRc PLS_INTEGER;
    BEGIN
    RETURN TO_NUMBER(GetString(Source_string、
    Field_Position、
    UnTerminated、
    Delimiter));
    END GetNumber; /*番号バージョン*/

    FUNCTION GetDate(Source_string IN VARCHAR2、
    Field_position IN NUMBER、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    RETURN DATE
    IS
    BEGIN
    RETURN TO_DATE(GetString(Source_string、
    Field_Position、
    UnTerminated、
    Delimiter)、'DD-MON-YYYY HH24:MI:SS');
    END GetDate; /*日付バージョン*/

    FUNCTION Locate(Source_string IN VARCHAR2、
    Search_String IN VARCHAR2、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    RETURN NUMBER
    IS
    iHit PLS_INTEGER:=0;
    iCounter PLS_INTEGER;
    vcCompare VARCHAR2(2000);
    BEGIN
    FOR iCounter IN 1 .. Counter(Source_String、UnTerminated、Delimiter)
    LOOP
    IF GetString(Source_String、
    iCounter、
    UnTerminated、
    Delimiter)=Search_String
    THEN
    iHit:=iCounter;
    EXIT;
    END IF;
    END LOOP;

    RETURN iHit;
    END Locate;

    FUNCTION Locate(Source_string IN VARCHAR2、
    Search_date IN DATE、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    RETURN NUMBER
    IS
    BEGIN
    RETURN Locate(Source_string、
    TO_CHAR(Search_date、'DD-MON-YYYY HH24:MI:SS')、
    UnTerminated、
    Delimiter);
    END検索; /*日付バージョン*/

    FUNCTION Locate(Source_string IN VARCHAR2、
    Search_number IN NUMBER、
    UnTerminated IN BOOLEAN DEFAULT FALSE、
    Delimiter IN VARCHAR2 DEFAULT'、')
    RETURN NUMBER
    IS
    BEGIN
    RETURN Locate(Source_string、
    TO_CHAR(Search_number)、
    UnTerminated、
    Delimiter);
    END Locate; /*番号バージョン*/
    END; /*本文*/
    /

    1. SelectQueryで条件付き書式設定にCaseステートメントを使用する方法-SQLServer/TSQLチュートリアルパート116

    2. Oracleでテーブルを変更する方法

    3. Oracleの同時実行性はSQLServerよりも優れていますか?

    4. データベース内の箇条書きを並べ替える