برای پاسخ به این سوال میتوانیم از رویه put_line که در پکیج utl_file قرار دارد استفاده کنید
به منظور پاسخ به این سوال باید گام های زیر را طی کنید
👈گام 1 : تعریف کردن یک شی از نوع directory و اعطای دسترسی های لازم به آن با استفاده از دستورات ذیل 👇👇👇
create or replace directory output_dir as ‘c:\output_dir’;
grant read , write on directory output_dir to hr;
👈 گام 2: تعریف متغیری از نوع )utl_file.file_type در سطر /*1*/ انجام شده است)
👈 گام 3: تعریف متغیری برای مشخص شدن تعداد سطرهای واکشی شده به منظور ایجاد فایل جدید در صورت خواندن 10 فایل (در سطر /*2*/ متغیری با نام v_row_num تعریف شده است) و تعریف متغیری به منظور ایجاد کردن فایل جدید از این متغیر در نام فایل ها استفاده میشود (در سطر /*3*/ متغیری با نام v_file_counter تعریف شده است)
👈گام 4: نوشتن پرس و جویی که کارمندان را از جدول مربوطه استخراج کند (سطر /*4*/)
👈گام 5: ایجاد حلقه به منظور پیمایش سطرهای پرس و جوی نوشته شده در گام 4 (سطر /*5*/) ، در این حلقه سطر به سطر پرس و جو خوانده شده و در فایل جاری درج میشود ، به ازای هر 10 سطر خوانده شده یک فایل جدید ایجاد میشود .
👈 گام 6: نوشتن شرط که به این صورت عمل میکند اگر سطر جاری سطر 1 بود (v_rownum = 1) یا اگر باقی مانده تقسیم تعداد رکورهای پیمایش شده بر 10 عدد 0 بود (mod(v_rownum, 10) = 0) کارهای ذبل را انجام میدهد (سطر /*6*/)
👈 در سطر /*7*/ در یک شرط از رویه is_open پکیج utl_file استفاده شده و اگر فایل باز شده ای وجود داشت فایل فوق را با استفاده از رویه fclose میبندد ، رویه های فوق متغیری تعریف شده در گام 2 را به عنوان ورودی دریافت میکند.
👈 در سطر /*8*/ مقدار 1 را به مقدار قبلی متغیر v_file_counter اضافه میکند
👈 در سطر /*9*/ از رویه fopen استفاده کرده و در directory تعریف شده در گام 1 ، یک فایل ایجاد میکند
👈 در سطر /*10*/ مقدار 1 را به مقدار قبلی متغیر v_row_num اضافه میکند
👈 در سطر /*11*/ مقدار ستون پرس و جوی نوشته شده در گام 4 را با استفاده از رویه put_line پکیج utl_file در فایل جاری درج میکند
👈 سطر /*12*/ در صورتی اجرا میشود که شرط تعریف شده در گام 6 برقرار نباشد و در این سطر مقدار 1 را به مقدار قبلی متغیر v_row_num اضافه میکند
👈 سطر /*13*/ در صورتی اجرا میشود که شرط تعریف شده در گام 6 برقرار نباشد و در این سطر رکورد جاری را در فایل جاری درج میکند
👈 سطر /*14*/ فایل باز شده را میبندد
👈سطر /*15*/ ، /*16*/ و /*17*/ در صورتی اجرا میشود که در کدهای نوشته شده خطایی از نوع invalid_filehandle اتفاق بیفتد
لطفا به کدهای نوشته شده ذیل دقت نمایید 👇👇👇
create or replace procedure example_write_emp_to_file as
/*1*/ v_file_type utl_file.file_type;
/*2*/ v_rownum number := 1;
/*3*/ v_file_counter number := 0;
/*4*/ cursor cur is
select employee_id || ‘;’ || first_name || ‘;’ || last_name || ‘;’ ||
email || ‘;’ || phone_number || ‘;’ ||
to_char(hire_date, ‘yyyy/mm/dd’) || ‘;’ || job_id || ‘;’ ||
salary || ‘;’ || commission_pct || ‘;’ || manager_id || ‘;’ ||
department_id rec
from employees emp
order by emp.employee_id;
begin
/*5*/ for r in cur loop
/*6*/ if v_rownum = 1 or mod(v_rownum, 10) = 0 then
/*7*/ if utl_file.is_open(file => v_file_type) then
utl_file.fclose(file => v_file_type);
end if;
/*8*/ v_file_counter := v_file_counter + 1;
/*9*/ v_file_type := utl_file.fopen(‘OUTPUT_DIR’,
’emp’ || v_file_counter || ‘.txt’,
‘w’);
/*10*/ v_rownum := v_rownum + 1;
/*11*/ utl_file.put_line(v_file_type, r.rec);
else
/*12*/ v_rownum := v_rownum + 1;
/*13*/ utl_file.put_line(v_file_type, r.rec);
end if;
end loop;
/*14*/ utl_file.fclose(file => v_file_type);
exception
/*15*/ when utl_file.invalid_filehandle then
/*16*/ raise_application_error(-20000, ‘file not valid’);
/*17*/ utl_file.fclose(file => v_file_type);
end example_write_emp_to_file;
خلاصه توضیحات ارائه شده در بخش بالا به صورت زیر میباشد
- به ازای هر بار فراخوانی ابتدا یک فایل ایجاد کرده و 10 رکورد در آن درج میکند
- به محض اینکه به رکورد 11 ام رسید فایل جدیدی ایجاد کرده و 10 رکورد بعدی را در آن درج میکند
- این کار را تا زمانی انجام میدهد که تمامی رکوردهای پرس و جو در فایل های ایجاد شده درج شود