Readme.ge Blog

FB image FB image

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

ავტორი: ალექსანდრე თარიღი: Wednesday, April 29th, 2009

ამ პოსტში მოკლედ განვიხილავ ორაკლიდან 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. თავში მოვიტყუე – ”მოკლედ განვიხილავ” თქო 😀

კატეგორიებში: ORACLE, SQL - PL/SQL. |

დატოვე კომენტარი

...