Plsql_Delimited_String.Getstring ([string berisi teks yang dibatasi, seluruh baris],
[kemunculan],
[boolean default salah yang tidak diakhiri],
[pembatas]);
Dalam prosedur berikut, pengguna akan memberikan nama file yang seharusnya berada di lokasi direktori yang dibuat di objek direktori Oracle, dalam contoh ini objek direktori 'YOUR_DIRECTORY' digunakan, ubah dengan objek direktori Anda dan salin file yang dibatasi di lokasi itu lalu lewati nama file untuk prosedur ini.
PROSEDUR BUAT ATAU GANTI Import_Emp_File (P_FILENAME DI VARCHAR2,o_msg OUT VARCHAR2)
ADALAH
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
V_Getstring VARCHAR2 (100 );
-- Larik Nilai Bidang
JENIS Nilai Bidang ADALAH TABEL VARCHAR2 (100)
INDEX OLEH 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);
-- menambahkan pipa tambahan di akhir baris untuk membaca semua bidang
Linebuf :=Linebuf || '|';
-- Misalkan file tersebut berisi enam delimited string dengan pipa (|)
FOR I IN 1 .. 6
LOOP
Field_Position (I) :=
Plsql_Delimited_String.Getstring (Linebuf ,
Saya,
SALAH,
'|');
END LOOP;
BEGIN
Total_Rec_Count :=Total_Rec_Count + 1;
-- contoh tabel
INSERT INTO EMP (EMPLOYEE_NUMBER,
FIRST_NAME,
LAST_NAME,
DATE_OF_JOIN,
EMP_TYPE,
DATE_OF_REGN)
VALUES (posisi_bidang (1),
posisi_bidang (2),
posisi_bidang (3),
posisi_bidang (4),
posisi_bidang (5),
posisi_bidang (6) );
Total_Rec_Processed :=Total_Rec_Processed + 1;
PENGECUALIAN
KETIKA LAINNYA
MAKA
-- mengabaikan kesalahan selama penyisipan database
NULL;
END;
AKHIR LOOP;
IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
JIKA UTL_FILE.is_open (infile)
MAKA
UTL_FILE.Fclose (Infile);
END IF;
JIKA total_rec_processed> 0
MAKA
COMMIT;
END IF;
KETIKA LAIN
MAKA
JIKA UTL_FILE.is_open (infile)
MAKA
UTL_FILE.Fclose (Infile);
END IF;
o_msg :=SQLERRM;
END;
/Berikut adalah sumber paket PLSQL_DELIMITED_STRING yang digunakan dalam contoh ini, instal paket ini di skema Anda. Paket berisi banyak fungsi utilitas lain yang dapat digunakan untuk membaca file csv menggunakan PLSQL:
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 dalam angka,
Field_position dalam angka,
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,
Pembatas di varchar2 default ',');
function GetString( Source_string di varchar2,
Field_position dalam jumlah,
Tidak Dihentikan di Boolean default FALSE,
Pembatas di varchar2 default ',') return varchar2;
function GetNumber( Source_string di varchar2,
Field_position dalam angka,
Tidak Dihentikan dalam Boolean default FALSE,
Pembatas di varchar2 default ', ') mengembalikan nomor;
function GetDate( Source_string di varchar2,
Field_position dalam angka,
Tidak Dihentikan dalam Boolean default FALSE,
Pembatas di varchar2 default ',') tanggal kembali;
function Locate( Source_string di varchar2,
Search_String di varchar2,
Tidak Dihentikan di Boole default FALSE,
Pembatas di varchar2 default ',') mengembalikan nomor;
function Locate( Source_string di varchar2,
Search_date in date,
UnTerminated in Boolean default FALSE,
Pembatas di varchar2 default ',') mengembalikan nomor;
function Locate( Source_string di varchar2,
Search_number di nomor,
Tidak Dihentikan di Boolean default FALSE,
Pembatas di varchar2 default ',') mengembalikan nomor;
END plsql_Delimited_String;
/
BUAT ATAU GANTI BODY PAKET plsql_Delimited_String
IS
FUNCTION Counter (Source_string IN VARCHAR2,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RE
ADALAH
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=PANJANG (Sumber_string);
BEGIN
JIKA Tidak Dihentikan
MAKA
iModifier :=1;
SELESAI JIKA;
RETURN (iOldSize - LENGTH (REPLACE (Source_string, Delimiter)))
+ iModifier;
END Counter;
PROSEDUR PutString (Source_string IN OUT VARCHAR2,
String_to_add IN VARCHAR2,
Field_position DALAM NUMBER,
Tidak Dihentikan DI 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. apakah string Panjang Nol?
IF iStrLen =0
THEN
JIKA Field_Position> 1
MAKA
UNTUK iCounter IN 2 .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || Pembatas;
END LOOP;
END IF;
Source_string :=vcSepBuffer || String_to_add;
JIKA TIDAK Dihentikan
MAKA
Source_string :=Source_String || Pembatas;
iStrLen :=LENGTH (Source_string);
END IF;
ELSE
-- 2. Mengatasi string yang tidak diakhiri
IF UnTerminated
THEN
Source_string :=Source_string || Pembatas;
END IF;
-- 3. Cari pemisah ke-1
IF Field_Position> 1
THEN
LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Pembatas,
1,
Field_Position - 1)
- 1)
+ LENGTH (Pembatas);
KELUAR SAAT iPtrStart> 0;
vcSepBuffer :=vcSepBuffer || Pembatas;
END LOOP;
JIKA vcSepBuffer BUKAN NULL
MAKA
iPtrEnd :=iStrLen;
ELSE
iPtrEnd :=
INSTR (Sumber_string,
Pembatas,
1 ,
Field_Position);
JIKA iPtrEnd =0
MAKA
iPtrEnd :=iStrLen;
END IF;
END IF;
ELSE
iPtrStart :=0;
iPtrEnd :=
INSTR (Source_string,
Pembatas,
1,
Field_Position);
JIKA iPtrEnd =0
MAKA
iPtrEnd :=iStrLen;
AKHIR JIKA;
AKHIR JIKA;
-- 3. Bangun kembali string
Source_string :=
SUBSTR (Source_string, 1, iPtrStart)
|| vcSepBuffer
|| String_to_tambahkan
|| Pembatas
|| SUBSTR (Sumber_string, iPtrEnd + PANJANG (Pembatas));
-- 4. Selesaikan penghentian
JIKA Tidak Dihentikan
MAKA
Source_string :=
SUBSTR (Source_String,
1,
(LENGTH (Source_string) - LENGTH (Pembatas)));
END IF;
END IF;
END PutString;
PROSEDUR PutNumber (Source_string IN OUT VARCHAR2,
number_to_add IN NUMBER,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT',')
ADALAH
BEGIN
-- 1. Lakukan saja konversi tipe data dan panggil varchar2 varsion dari put..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (number_to_add),
Field_position,
Tidak Dihentikan,
Pembatas);
END PutNumber;
PROSEDUR 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. Lakukan saja konversi tipe data dan panggil varchar2 varsion dari put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-SEN-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
JIKA Tidak Dihentikan
MAKA
vcSourceStrCopy :=vcSourceStrCopy || Pembatas;
END IF;
IF Field_Position> 1
THEN
iPtrStart :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position - 1)
+ LENGTH (Pembatas);
ELSE
iPtrStart :=1;
END IF;
iPtrEnd :=
INSTR (vcSourceStrCopy,
Pembatas,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
AKHIR GetString; /* Versi String */
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; /* Versi Angka */
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');
AKHIR GetDate; /* Versi Tanggal */
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
UNTUK iCounter IN 1 .. Counter (Source_String, UnTerminated, Delimiter)
LOOP
JIKA GetString (Source_String,
iCounter,
UnTerminated,
Delimiter) =Search_String
THEN
iHit :=iCounter;
EXIT;
END IF;
END LOOP;
RETURN iHit;
END Cari;
FUNCTION Locate (Source_string IN VARCHAR2,
Search_date IN DATE,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
ADALAH
BEGIN
RETURN Locate (Source_string,
TO_CHAR (Search_date, 'DD-MON-YYYY HH24:MI:SS'),
Tidak Dihentikan,
Delimiter);
AKHIR Cari; /* Versi Tanggal */
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; /* Versi Angka */
AKHIR; /* Badan */
/