Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Baca Dan Impor File CSV Di Oracle PL/SQL Secara Efisien

Contoh diberikan di bawah ini untuk membaca dan mengimpor CSV file (dibatasi koma) di PLSQL. Ada paket dalam bentuk Oracle "D2k_Delimited_String" yang kami gunakan untuk membaca dan mengimpor file yang dibatasi koma (atau pembatas apa pun), saya telah menulis posting juga di Oracle Forms untuk membaca file yang dibatasi dengan paket ini, berikut ini tautannya https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Paket yang sama saya konversi ke paket database untuk membaca file CSV di PLSQL secara efisien, saya menamai ulang paket tersebut menjadi "Plsql_Delimited_String". Di bawah ini adalah contoh yang diberikan untuk mengimpor file csv di PL SQL dengan bantuan fungsi paket Get_String ini, berikut adalah penggunaan fungsi ini:

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:

BUAT ATAU GANTI PAKET plsql_Delimited_String IS

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 */
/

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. _gc_fusion_compression

  2. Menginstal Oracle 12c Enterprise Edition di Windows 7

  3. Apa perbedaan antara 'YYYY' dan 'RRRR' di Oracle SQL

  4. 19.3 PDB Tutup ORA-65107 ORA-16078

  5. Bagaimana cara membuat Oracle membuat pernyataan tabel di SQL*Plus