Mam za zadanie utworzyć pakiet, który będzie eksportował wynik funkcji, która zwraca sys_refcursor do plików w formacie .txt, .csv, .xml.
Ciało funkcji get_cursor:
FUNCTION get_cursor( tabname IN varchar2, cols IN array_t, vals IN array_t, rels IN array_t ) RETURN sys_refcursor IS cur sys_refcursor; where_statement varchar2(1000); tmp varchar2(1000); begin IF cols.last != 0 then where_statement := 'WHERE ' || cols(1) || ' ' || rels(1) || ' '; IF (rels(1) = 'in' OR rels(1) = 'not in') then where_statement := where_statement || trim(BOTH '''' FROM vals(1)); elsif (utils.is_number(vals(1)) = 'N' AND substr( vals(1), 1, 8 ) != 'TO_DATE(') then where_statement := where_statement || '''' || vals(1) || ''''; else where_statement := where_statement || vals(1); end IF; FOR i IN 2..cols.last loop where_statement := where_statement || ' AND ' || cols(i) || ' ' || rels(i) || ' '; IF (rels(i) = 'in' OR rels(i) = 'not in') then where_statement := where_statement || trim(BOTH '''' FROM vals(i)); elsif ( utils.is_number(vals(i)) = 'N' AND substr( vals(i), 1, 8 ) != 'TO_DATE(') then where_statement := where_statement || '''' || vals(i) || ''''; else where_statement := where_statement || vals(i); end IF; end loop; end IF; open cur FOR 'SELECT * FROM ' || tabname || ' ' || where_statement; RETURN cur; end get_cursor;
Procedury, których potrzebuję muszą, jako argumenty, pobierać dokładnie te argumenty, które pobiera funkcja powyżej (aby ją wywołać) + ścieżkę do pliku i nazwę:
np.
procedure txt_export( tabname IN varchar2, cols IN array_t, vals IN array_t, rels IN array_t, path IN varchar2, file_name IN varchar2) IS l_file utl_file.file_type; tmp_file_name varchar2(4000) := file_name; begin IF (tmp_file_name LIKE '%.txt') then l_file := utl_file.fopen(path, tmp_file_name, 'w'); elsif (tmp_file_name NOT LIKE '%.txt') then tmp_file_name := tmp_file_name || '.txt'; l_file := utl_file.fopen(path, tmp_file_name, 'w'); end IF; /* tutaj muszę wywołać funckję get_cursor(p1, p2, p3, p4) i jej wynik zapisać do pliku txt. */ utl_file.fclose(l_file); end;
Bardzo proszę o pomoc, próbuję to zrobić od dwóch dni i nijak mi nie wychodzi.