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ファイルを読み取るために使用できる他の多くのユーティリティ関数が含まれています。
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; /*本文*/
/