Terkadang Anda memiliki file teks atau CSV yang sangat besar untuk diproses, tetapi pertama-tama Anda ingin membuat file yang lebih kecil dari file besar itu. Karena file besar itu mungkin membutuhkan terlalu banyak waktu untuk diproses atau dibuka. Jadi saya memberikan contoh di bawah ini untuk membagi file teks/CSV besar menjadi beberapa file dalam PL SQL menggunakan prosedur tersimpan.
Anda hanya perlu meneruskan dua parameter ke prosedur PL SQL ini, pertama adalah nama objek direktori database, tempat file teks berada dan yang kedua adalah nama file sumber (file yang ingin Anda pisahkan).
Jika objek direktori Oracle tidak ada untuk lokasi file teks, maka Anda dapat membuatnya seperti yang ditunjukkan di bawah ini:
For windows: CREATE OR REPLACE DIRECTORY CSV_FILE_DIR AS 'D:\plsql\text_files';
For Linux/Unix (due to difference in path): CREATE OR REPLACE DIRECTORY CSV_FILE_DIR AS '/plsql/text_files';
Ubah jalur di atas sesuai dengan lokasi file Anda. Kemudian buat prosedur di bawah ini dengan menjalankan skripnya:
CREATE OR REPLACE PROCEDURE split_file (p_db_dir IN VARCHAR2, p_file_name IN VARCHAR2) IS read_file UTL_FILE.file_type; write_file UTL_FILE.file_type; v_string VARCHAR2 (32767); j NUMBER := 1; BEGIN read_file := UTL_FILE.fopen (p_db_dir, p_file_name, 'r'); WHILE j > 0 LOOP write_file := UTL_FILE.fopen (p_db_dir, j || '_' || p_file_name, 'w'); FOR i IN 1 .. 100 LOOP -- example to dividing into 100 rows for each file.. you can increase the number as per your requirement UTL_FILE.get_line (read_file, v_string); UTL_FILE.put_line (write_file, v_string); END LOOP; UTL_FILE.fclose (write_file); j := J + 1; END LOOP; EXCEPTION WHEN OTHERS THEN -- this will handle if reading source file contents finish UTL_FILE.fclose (read_file); UTL_FILE.fclose (write_file); END;
Prosedur ini membagi 100 baris untuk setiap file, yang dapat Anda modifikasi sesuai kebutuhan Anda. Sekarang jalankan prosedur ini seperti yang ditunjukkan di bawah ini dengan mengirimkan nama objek direktori database dan nama file:
BEGIN split_file ('CSV_FILE_DIR', 'text_file.csv'); END;
Anda dapat memeriksa lokasi file Anda (CSV_FILE_DIR) untuk beberapa file yang dimulai dengan angka seperti 1_text_file.csv, 2_text_file.csv dan seterusnya, seperti yang ditunjukkan pada gambar di bawah ini: