سوال 3️⃣ چگونه خروجی یک پرس و جو (select) را در فایل ذخیره کنیم به نحوی که هر 10 رکورد در فایل جداگانه ای قرار داده شود ؟

✔️ برای پاسخ به این سوال میتوانیم از رویه 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: تعریف متغیری به منظور ایجاد کردن فایل جدید از این متغیر در نام فایل ها استفاده میشود (در سطر /*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 رکورد بعدی را در آن درج میکند
🖌 این کار را تا زمانی انجام میدهد که تمامی رکوردهای پرس و جو در فایل های ایجاد شده درج شود

دانلود فایل pdf