środa, 2 listopada 2011

Korzystanie z plików tekstowych przy użyciu pakietu UTL_FILE

Korzystanie z plików tekstowych przy użyciu pakietu UTL_FILE




Z poziomu PL SQL możemy korzystać z zewnętrznych plików przy pomocy pakietu UTL_FILE. Aby móc z niego korzystać należy uprzednio użytkownikowi nadać uprawnienia :



(z sysa) GRANT EXECUTE ON UTL_FILE TO HR;



Musimy też zadbać o to, by katalog do którego będziemy sięgać był widoczny z poziomu Oracle:



(z sysa)  CREATE DIRECTORY DANE AS 'C:\DANE'



oraz oczywiście by użytkownik miał do niego odpowiednie uprawnienia:



(z sysa)  GRANT READ,WRITE ON DIRECTORY DANE TO HR;






Pisanie do pliku


Poniższy kod dodaje do pliku mojedane.csv znajdującego się w katalogu c:\dane dwie linie:


declare
plik utl_file.file_type;
begin
plik:=utl_file.fopen('DANE','mojedane.csv','a');
utl_file.put_line(plik,'Romek;507000000;');
utl_file.put_line(plik,'Zenek;503000000;');
utl_file.fclose(plik);
end;



plik utl_file.file_type - jest to uchwyt do naszego fizycznego pliku na dysku. Musi być typu „file_type” znajdującego się w pakiecie utl_file.









plik:=utl_file.fopen('DANE','mojedane.csv','a'); - dowiązanie do uchwytu (dotychczas niezainicjowanego) pliku mojedane.csv znajdującego się w katalogu który wewnątrz bazy reprezentowany jest pod nazwą DANE. Z tą nazwą katalogu jest takie drobne utrudnienie – zawsze pisz dużymi literami w tym miejscu, nawet jeśli katalog podczas jego mapowania (create directory dane as 'c:\dane') nazwaliście małymi literami. Inaczej powie że nie ma takiego katalogu. Trzeci parametr określa rodzaj dostępu do pliku. „a” oznacza stworzenie pliku jeśli go nie ma, a jeśli jest to dopisanie czegoś do niego. Może być też „w” które oznacza że jeśli plik jest to zostanie zastąpiony nowym, lub „r” jeśli plik będziemy czytać.


utl_file.put_line(plik,'Romek;507000000;'); - dopisanie linijki do pliku który znajduje się pod uchwytem o nazwie „plik”.



utl_file.fclose(plik); - zamykamy dowiązanie do pliku, by przy ponownej próbie dostępu Oracle nie zgłosił nam że zasób jest zajęty.



Odczyt pliku



declare
plik utl_file.file_type;
linia varchar2(500);
begin
plik:=utl_file.fopen('DANE','mojedane.csv','r');
loop
utl_file.get_line(plik,linia);
dbms_output.put_line(linia);
end loop;
exception
when others then
utl_file.fclose(plik);
end;



plik:=utl_file.fopen('DANE','mojedane.csv','r'); - otwarcie pliku do odczytu.
utl_file.get_line(plik,linia); - wywołanie procedury z jednym parametrem wejściowym a drugim wyjściowym. Do zmiennej linia ładowana jest kolejna linia z pliku dowiązanego pod zmienną plik.



Część z obsługą wyjątków jest tutaj dlatego, że Oracle nie dostarcza metody sprawdzania czy w pliku znajduje się kolejna linia do przeczytania. W pewnym więc momencie będziemy próbowali odczytać linię której nie ma, więc zgłoszony zostanie wyjątek.

1 komentarz:

  1. powinna informacja być wzbogacona o pliki z polskimi literami, przy odczycie pojawiają sie pytajniki

    OdpowiedzUsuń