utl_file – ფაილის წაკითხვა-ჩაწერა pl/sql-დან
ამ პოსტში მოკლედ განვიხილავ ორაკლიდან pl/sql-ის საშუალებით ფაილის ჩაწერა-წაკითხვის პროცედურას. იგი ერთგვარი გაგრძელებაა ძველი პოსტის Oracle-ის External Tables და მათან მუშაობა ხდება utl_file პაკეიჯის მეშვეობით. თავინდა სამუშაოდ გვჭირდება ორაკლის დირექტორია რომელსაც შევქმნით შემდეგი sql-ით
1 | CREATE OR REPLACE directory MY_DIR AS '/u01/share/mydir'; |
ალბათ ხვდებით რომ ‘/u01/share/mydir’ არის დირექტორიის (ლინუქსის) სრული მისამართი და თუ სერვერი მოგვეპოვება ვინდოუსის პლათფორმაზე მაშინ მისი მისამართი იქნება შესაბამისი – ‘c:\mydir .
(გაითვალისწინეთ რომ ლინუქსის შემთხვევაში ‘/u01/share/mydir’ -ს უნდა ჰქონდეს ჩაწერის უფლება 🙂 )
მაშ ასე ორაკლის დორექტორიაც გვაქვს, ეხლა მარტივად შეგვიძლია ამ დირექტორიაში გავხსნათ ფაილი და ჩავწეროთ რაიმე სტრინგი
1 2 3 4 5 6 7 8 9 | 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; |
‘/u01/share/mydir’ დირექტორიის ფაილ მენეჯერიდან გადამოწმებს შემდეგ აღმოვაჩენთ რომ გაჩნდა ფაილი სახელად some.txt და შიგთავსით
some text
next text
more text
ეხლა წავიკითხოთ ეს ფაილი ისევ utl_file პაკეიჯის გამოყენებით, აქვე თემა რო ძალიან არ გაიწელოს ვიტყვი რომ დაგვჭირდება EXCEPTION-ების კონტროლიც.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; |
შედეგი –
some text
next text
more text
ჩაწერის პროცედურაში შეგვიძლია შედეგები უფრო სრულად ვაკონტროლოთ, მაგალითად წინასწარ 0-ს გატოლებული რაიმე ცვლადი ციკლში ვზარდოთ 1-ით და ბოლოს მივიღებთ თუ რამდენი ხაზის წაკითხვა მოხდა ან შეცდომის შემთხვევაში EXCEPTION-ით დააბრუნოს შეცდომის კოდი და განმარტება და ა.შ. –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; |
შედეგი –
some text
next text
more text
End of file. 3 line retrieved.
და ხელოვნური შეცდომისთვის ფაილის არასწორი სახელი გადავცეთ და ვნახოთ შედეგი –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; |
შედეგი –
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. თავში მოვიტყუე – ”მოკლედ განვიხილავ” თქო 😀