Sunteți pe pagina 1din 4

Pachetul UTL_FILE

UTL_FILE este un pachet Oracle PL/SQL utilizat pentru operaiunile cu fiiere (citire i scriere). UTL_FILE funcioneaz att pentru server, ct i pentru client. UTL_FILE conine urmtoarele subprograme:

FCLOSE nchide un fiier. FCLOSE_ALL nchide toate fiierele deschise. FCOPY copiaz o zon contigu dintr-un fiier ntr-un fiier nou creat. Are urmtorii parametri: src_location, src_filename, dest_location, dest_filename, start_line, and end_line. FFLUSH scrie tot outputul ntr-un fiier. FGETATTR citete i returneaz atributele unui disc. Returneaz urmtoarele informaii despre fiier: locaie, nume, fexists (un boolean), file_length (n bytes) i block_size. Locaia trebuie s fie un director existent pe server i s fie n parametrul utl_file_dir, sau s fie un director. FGETPOS returneaz poziia (offsetul) curent relativ ntr-un fiier, n bytes sau binary_integer. FOPEN deschide un fiier pentru input sau output. Are urmtorii parametri: locaie, nume, open_mode i max_linesize. FOPEN_NCHAR deschide un fiier n Unicode pentru input sau output. FREMOVE - terge un fiier de pe disc, dac userul are drepturi pentru a face acest lucru. Are ca parametri locaia i numele. FRENAME renumete un fiier existent (similar cu funcia UNIX mv). Parametrii sunt: src_location, src_filename, dest_location, dest_filename i overwrite (un boolean). Dac fiierul exist deja, va fi suprascris. FSEEK mut nainte sau napoi pointerul n fiier n funcie de numrul specificat de bytes. FSEEK takes the following parameters: fiierul file, absolute_offset (un binary_integer) i relative_offset (binary_integer). GET_LINE citete text dintr-un fiier deschis. Parametrii sunt: fiierul file (record), buffer (varchar2) i lungimea len (a binary_integer). GET_LINE_NCHAR citete text n Unicode dintr-un fiier deschis. GET_LINE_NCHAR primete doi parametri: fiierul (record), buffer (nvarchar2), i lungimea len (binary_integer). GET_RAW parametri: file (record), buffer (raw), len (a binary_integer) IS_OPEN determin dac fiierul este deschis. NEW_LINE scrie unul sau mai muli terminatori de fiier specifici sistemului de operare. NEW_LINE primete urmtorii parametri: file (record), lines (binary_integer). PUT scrie un string ntr-un fiier. Parametrii sunt: file (record), buffer (varchar2). PUT_LINE scrie o linie ntr-un fiier i adaug terminatorul de linie specific sistemului de operare. Dac linia era deja scris, ncepe o linie nou cu CR/LF. This implies that the file, when being written into, does not end with CR/LF. In Parametrii: file (record), buffer (varchar2). 1

PUT_LINE_NCHAR scrie un rnd Unicode ntr-un fiier. PUT_LINE primete ca parametri un fiier file (record), buffer (nvarchar2), autoflush (boolean). PUT_NCHAR scrie text Unicod ntr-un fiier. PUT primete urmtorii parametri: file (record), buffer (nvarchar2). PUTF - procedur PUT cu formatare. PUTF_NCHAR procedur PUT_NCHAR cu formatare PUT_RAW accept ca input date RAW i scrie valoarea n bufferul de output.

Pentru a putea lucra cu directoarele i fiierele de pe server, trebuie s modificm fiierul init.ora, adugnd UTL_FILE_DIR=* (pot fi accesate toate folderele). Alte variante ar fi s specificm numai numele directorului unde permitem accesul, de exemplu UTL_FILE_DIR=C:\. Dup restartarea serverului, rulm din SQL Developer (SYS) urmtoarele:

CREATE DIRECTORY MYDIR AS 'C:\ '; GRANT READ, WRITE ON DIRECTORY MYDIR TO usr; Output-ul este: Directory created. Grant succeded. Rulm primul script, pentru crearea unui fiier n MYDIR.
DECLARE FILE_HANDLER UTL_FILE.FILE_TYPE; BEGIN FILE_HANDLER := UTL_FILE.FOPEN('MYDIR', 'un_fisier.txt', 'W'); UTL_FILE.PUTF(FILE_HANDLER, 'Primul fisier creat pe server cu PL/SQL.'); UTL_FILE.FCLOSE(FILE_HANDLER); END; / Output: Anonymous block completed Pe server, n directorul specificat, a fost creat fiierul un_fisier.txt ce conine textul 'Primul fisier creat pe server cu PL/SQL.'.

Pentru a copia un fiier n altul: BEGIN utl_file.fcopy('MYDIR', 'un_fisier.txt', 'MYDIR', 'dump.txt'); END; / Dac fiierul nou exista deja, este suprascris.

Cu funcia FGETATTR, putem afla informaii despre un fiier: DECLARE ex flen BEGIN utl_file.fgetattr('MYDIR', 'dump.txt', ex, flen, bsize); IF ex THEN dbms_output.put_line('Fisierul exista'); ELSE dbms_output.put_line('Fisierul nu exista'); END IF; dbms_output.put_line('File Length: ' || TO_CHAR(flen)); dbms_output.put_line('Block Size: ' || TO_CHAR(bsize)); END fgetattr; / Putem scrie ntr-un fiier rezultatul unui SELECT. De exemplu: DECLARE FILE_HANDLER UTL_FILE.FILE_TYPE; v_first_name VARCHAR2(30); v_last_name BEGIN FILE_HANDLER := UTL_FILE.FOPEN('MYDIR', 'person.txt', 'W'); SELECT first_name, last_name INTO v_first_name, V_last_name FROM employees WHERE employee_id=120; UTL_FILE.PUTF(FILE_HANDLER, v_first_name || v_last_name ); UTL_FILE.FCLOSE(FILE_HANDLER); END; / Fiierul person.txt va conine textul MatthewWeiss. Cu ajutorul utl_file, putem ncrca date dintr-un fiier n baza de date Oracle. Am ncercat s testez acest lucru, ns nu am reuit s gsesc o metod pentru a parsa textul. Mai testez i mai caut metode... 3 VARCHAR2(30); BOOLEAN; NUMBER;

bsize NUMBER;

DECLARE v_file UTL_FILE.FILE_TYPE; v_line VARCHAR2(2000); BEGIN v_file := UTL_FILE.FOPEN ('MYDIR','data.txt','r'); LOOP utl_file.get_line (v_file, v_line); IF v_line IS NULL THEN EXIT; END IF; INSERT INTO students VALUES (v_line, v_line ); END LOOP; END; / De asemenea, utilitatea pachetului utl_file este faptul c un fiier Excel/csv se poate importa n Oracle. -- aici nu e bine

Bibliografie: http://psoug.org/reference/ http://oreilly.com/catalog/oraclebip/chapter/ch06.html http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_file.htm#ARPLS70906 http://docstore.mik.ua/orelly/oracle/bipack/ch06_02.htm

S-ar putea să vă placă și