utl_file – ფაილის წაკითხვა-ჩაწერა pl/sql-დან

ამ პოსტში მოკლედ განვიხილავ ორაკლიდან pl/sql-ის საშუალებით ფაილის ჩაწერა-წაკითხვის პროცედურას. იგი ერთგვარი გაგრძელებაა ძველი პოსტის Oracle-ის External Tables და მათან მუშაობა ხდება utl_file პაკეიჯის მეშვეობით. თავინდა სამუშაოდ გვჭირდება ორაკლის დირექტორია რომელსაც შევქმნით შემდეგი sql-ით
[cc lang=”plsql”] create or replace directory MY_DIR as ‘/u01/share/mydir’; [/cc]

ალბათ ხვდებით რომ ‘/u01/share/mydir’ არის დირექტორიის (ლინუქსის) სრული მისამართი და თუ სერვერი მოგვეპოვება ვინდოუსის პლათფორმაზე მაშინ მისი მისამართი იქნება შესაბამისი – ‘c:\mydir .
(გაითვალისწინეთ რომ ლინუქსის შემთხვევაში ‘/u01/share/mydir’ -ს უნდა ჰქონდეს ჩაწერის უფლება 🙂 )
მაშ ასე ორაკლის დორექტორიაც გვაქვს, ეხლა მარტივად შეგვიძლია ამ დირექტორიაში გავხსნათ ფაილი და ჩავწეროთ რაიმე სტრინგი

[cc lang=”plsql”]declare
f utl_file.file_type;
begin
f := utl_file.fopen(‘MY_DIR’, ‘some.csv’, ‘w’);
utl_file.put_line(f, ‘some text’);
utl_file.put_line(f, ‘next text’);
utl_file.put_line(f, ‘more text’);
utl_file.fclose(f);
end;[/cc]

‘/u01/share/mydir’ დირექტორიის ფაილ მენეჯერიდან გადამოწმებს შემდეგ აღმოვაჩენთ რომ გაჩნდა ფაილი სახელად some.txt და შიგთავსით

some text
next text
more text

ეხლა წავიკითხოთ ეს ფაილი ისევ utl_file პაკეიჯის გამოყენებით, აქვე თემა რო ძალიან არ გაიწელოს ვიტყვი რომ დაგვჭირდება EXCEPTION-ების კონტროლიც.
[cc lang=”plsql”]
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_emprec VARCHAR2(120);
BEGIN
v_empfile := UTL_FILE.FOPEN(‘MY_DIR’,’some.csv’,’r’);
LOOP
UTL_FILE.GET_LINE(v_empfile,v_emprec);
DBMS_OUTPUT.PUT_LINE(v_emprec);
END LOOP;
UTL_FILE.FCLOSE(v_empfile);
EXCEPTION
WHEN NO_DATA_FOUND THEN
return;
END;
[/cc]
შედეგი –

some text
next text
more text

ჩაწერის პროცედურაში შეგვიძლია შედეგები უფრო სრულად ვაკონტროლოთ, მაგალითად წინასწარ 0-ს გატოლებული რაიმე ცვლადი ციკლში ვზარდოთ 1-ით და ბოლოს მივიღებთ თუ რამდენი ხაზის წაკითხვა მოხდა ან შეცდომის შემთხვევაში EXCEPTION-ით დააბრუნოს შეცდომის კოდი და განმარტება და ა.შ. –
[cc lang=”plsql”]
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_text VARCHAR2(120);
v_line INTEGER := 0;
BEGIN
v_empfile := UTL_FILE.FOPEN(‘MY_DIR’,’some.csv’,’r’);
LOOP
UTL_FILE.GET_LINE(v_empfile,v_text);
DBMS_OUTPUT.PUT_LINE(v_text);
v_line := v_line + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(v_empfile);
DBMS_OUTPUT.PUT_LINE(‘End of file. ‘|| v_line || ‘ line retrieved.’);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘SQLERRM: ‘ || SQLERRM);
DBMS_OUTPUT.PUT_LINE(‘SQLCODE: ‘ || SQLCODE);
END;
[/cc]

შედეგი –

some text
next text
more text
End of file. 3 line retrieved.

და ხელოვნური შეცდომისთვის ფაილის არასწორი სახელი გადავცეთ და ვნახოთ შედეგი –
[cc lang=”plsql”]DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_text VARCHAR2(120);
v_line INTEGER := 0;
BEGIN
v_empfile := UTL_FILE.FOPEN(‘MY_DIR’,’some1.csv’,’r’);
LOOP
UTL_FILE.GET_LINE(v_empfile,v_text);
DBMS_OUTPUT.PUT_LINE(v_text);
v_line := v_line + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(v_empfile);
DBMS_OUTPUT.PUT_LINE(‘End of file. ‘|| v_line || ‘ line retrieved.’);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘SQLERRM: ‘ || SQLERRM);
DBMS_OUTPUT.PUT_LINE(‘SQLCODE: ‘ || SQLCODE);
END;
[/cc]
შედეგი –

SQLERRM: ORA-29283: invalid file operation
ORA-06512: at “SYS.UTL_FILE”, line 475
ORA-29283: invalid file operation
SQLCODE: -29283

არასწორი დირექტორიის გადაცემისას –

SQLERRM: ORA-29280: invalid directory path
SQLCODE: -29280

და ასე შემდეგ.

წარმატებულ read-write -ს გისურვებთ 🙂

P.S. თავში მოვიტყუე – ”მოკლედ განვიხილავ” თქო 😀

Leave a Reply

Your email address will not be published. Required fields are marked *