
مقدمه : UTL_FILE چیست و چه کاربردی دارد؟
اگر در حال کار با Oracle هستید و نیاز دارید با فایلهای متنی روی سرور تعامل داشته باشید، پکیج UTL_FILE یکی از ابزارهای کلیدی PL/SQL است که باید به خوبی بشناسید.
این پکیج به شما اجازه میدهد فایلهای متنی را بخوانید، بنویسید، لاگ ثبت کنید یا حتی دادهها را از فایل به جدول وارد کنید.
در این مقاله آموزش Oracle، قراره خیلی ساده و کاربردی با پکیج UTL_FILE آشنا بشیم و ببینیم چطور میشه با استفاده از اون، فایلخوانی و فایلنویسی رو در محیط Oracle انجام داد.
اگر می خواهید در مورد پکیج DBMS_ALERT در بخش آموزش PL/SQL بیشتر آشنا بشید نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
شروع کار با UTL_FILE در Oracle
قبل از هر چیز، Oracle برای امنیت، اجازه نمیده به هر مسیری روی سیستمعامل دسترسی داشته باشید.
بنابراین باید مسیر مجازی تعریف کنید که Oracle بتونه فایلهارو اونجا بخونه یا بنویسه.
تعریف مسیر دسترسی به فایل در Oracle
بهترین روش برای این کار استفاده از دستور زیره:
CREATE OR REPLACE DIRECTORY my_dir AS '/u01/app/files';
GRANT READ, WRITE ON DIRECTORY my_dir TO your_user;
توجه: این مسیر باید واقعی و روی همان سیستمی باشه که دیتابیس Oracle روی اون اجرا میشه.
توابع و پروسیجرهای مهم UTL_FILE
۱. FOPEN – باز کردن فایل
f := UTL_FILE.FOPEN('MY_DIR', 'report.txt', 'W');
حالتها:
'R'
: خواندن فایل'W'
: نوشتن و پاک کردن محتوای قبلی'A'
: اضافه کردن به انتهای فایل
۲. PUT_LINE – نوشتن یک خط در فایل
UTL_FILE.PUT_LINE(f, 'in ye nemoone report ast.');
۳. PUT و NEW_LINE – نوشتن بدون رفتن به خط جدید
UTL_FILE.PUT(f, 'shomare personeli:');
UTL_FILE.PUT(f, 1234);
UTL_FILE.NEW_LINE(f);
۴. GET_LINE – خواندن یک خط از فایل
DECLARE
f UTL_FILE.FILE_TYPE;
txt VARCHAR2(4000);
BEGIN
f := UTL_FILE.FOPEN('MY_DIR', 'data.txt', 'R');
LOOP
BEGIN
UTL_FILE.GET_LINE(f, txt);
DBMS_OUTPUT.PUT_LINE(txt);
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(f);
END;
۵. IS_OPEN – بررسی باز بودن فایل
IF UTL_FILE.IS_OPEN(f) THEN
UTL_FILE.FCLOSE(f);
END IF;
۶. FCLOSE و FCLOSE_ALL – بستن فایلها
UTL_FILE.FCLOSE(f);
UTL_FILE.FCLOSE_ALL;
مثال کاربردی: گرفتن خروجی از جدول به فایل متنی
DECLARE
f UTL_FILE.FILE_TYPE;
CURSOR emp_cur IS
SELECT empno, ename, job FROM emp;
v_line VARCHAR2(1000);
BEGIN
f := UTL_FILE.FOPEN('MY_DIR', 'employees.txt', 'W');
FOR rec IN emp_cur LOOP
v_line := rec.empno || ',' || rec.ename || ',' || rec.job;
UTL_FILE.PUT_LINE(f, v_line);
END LOOP;
UTL_FILE.FCLOSE(f);
END;
خطاهای رایج در کار با UTL_FILE
در هنگام کار با این پکیج ممکنه به خطاهای زیر برخورد کنید:
کد خطا | توضیح |
---|---|
ORA-29280 | مسیر فایل نامعتبر یا بدون دسترسی |
ORA-29283 | فایل پیدا نشد |
ORA-06512 | خطا در اجرای PL/SQL |
نکات امنیتی و پیشرفته در مورد UTL_FILE
- همیشه به جای
UTL_FILE_DIR
ازCREATE DIRECTORY
استفاده کنید. - فایلهایی که میخواید بخونید یا بنویسید باید در سروری باشن که دیتابیس Oracle روش نصبه.
- این پکیج فقط برای فایلهای متنی مناسبه. برای فایلهای باینری، از
BFILE
یاDBMS_LOB
استفاده کنید.
سوالات متداول درباره پکیج UTL_FILE در اوراکل
خطای ORA-29280: invalid directory path
معمولاً به دلیل یکی از موارد زیر رخ میدهد:
- مسیر تعریفشده با
CREATE DIRECTORY
وجود ندارد یا اشتباه نوشته شده - کاربر فعلی مجوز
READ
یاWRITE
روی مسیر دایرکتوری ندارد - فایلسیستم اجازه دسترسی به Oracle نمیدهد (مثلاً به دلیل permissionهای OS)
بله. UTL_FILE میتواند با فایلهای CSV به خوبی کار کند چون اساساً فایلهای متنی هستند. کافیست دادهها را با جداکننده (مثلاً کاما) از هم جدا کنید:
UTL_FILE.PUT_LINE(f, empno || ‘,’ || ename || ‘,’ || sal);
و هنگام خواندن از GET_LINE
استفاده کرده و دادهها را با SUBSTR
یا REGEXP_SUBSTR
جدا کنید.
خیر. UTL_FILE
فقط روی سروری کار میکند که دیتابیس Oracle روی آن نصب است.
اگر فایل روی کامپیوتر کلاینت است، باید ابتدا فایل را به سرور منتقل کنید یا از ابزارهایی مثل SQL*Loader
یا Oracle External Table استفاده نمایید.
برای امنیت بیشتر، Oracle فقط به مسیرهایی اجازه دسترسی میدهد که از قبل تعریف شده باشند. بهترین روش برای مشخص کردن مسیر مجاز استفاده از دستور CREATE DIRECTORY
است:
CREATE OR REPLACE DIRECTORY my_dir AS ‘/u01/app/files’;
GRANT READ, WRITE ON DIRECTORY my_dir TO your_user;
نتیجهگیری : چرا باید UTL_FILE رو بلد باشیم؟
یاد گرفتن پکیج UTL_FILE
یکی از مهارتهای ضروری برای هر توسعهدهنده PL/SQL هست.
این ابزار میتونه کارهای زیادی رو برای شما سادهتر کنه؛ از لاگبرداری دقیق تا پردازش فایلهای CSV و تولید گزارشهای خروجی.
اگه دوست دارید یه پروژه واقعی مثل خوندن فایل ورودی و ذخیره توی جدول بنویسم، یا حتی پردازش فایلهای گزارش مالی، فقط کافیه بگید.
📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در استفاده از پکیج UTL_FILE دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید