Witam,
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.