Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapis do pliku returna (sys_refcursor) innej funkcji.
Forum PHP.pl > Forum > Bazy danych > Oracle
llepec
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:

  1. FUNCTION get_cursor(
  2. tabname IN varchar2,
  3. cols IN array_t,
  4. vals IN array_t,
  5. rels IN array_t )
  6. RETURN sys_refcursor
  7. IS
  8. cur sys_refcursor;
  9. where_statement varchar2(1000);
  10. tmp varchar2(1000);
  11. begin
  12. IF cols.last != 0 then
  13. where_statement := 'WHERE ' || cols(1) || ' ' || rels(1) || ' ';
  14. IF (rels(1) = 'in' OR rels(1) = 'not in') then
  15. where_statement := where_statement || trim(BOTH '''' FROM vals(1));
  16. elsif (utils.is_number(vals(1)) = 'N' AND substr( vals(1), 1, 8 ) != 'TO_DATE(') then
  17. where_statement := where_statement || '''' || vals(1) || '''';
  18. else
  19. where_statement := where_statement || vals(1);
  20. end IF;
  21. FOR i IN 2..cols.last
  22. loop
  23. where_statement := where_statement || ' AND ' || cols(i) || ' ' || rels(i) || ' ';
  24. IF (rels(i) = 'in' OR rels(i) = 'not in') then
  25. where_statement := where_statement || trim(BOTH '''' FROM vals(i));
  26. elsif ( utils.is_number(vals(i)) = 'N' AND substr( vals(i), 1, 8 ) != 'TO_DATE(') then
  27. where_statement := where_statement || '''' || vals(i) || '''';
  28. else
  29. where_statement := where_statement || vals(i);
  30. end IF;
  31. end loop;
  32. end IF;
  33. open cur FOR 'SELECT * FROM ' || tabname || ' ' || where_statement;
  34. RETURN cur;
  35. 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.

  1. procedure txt_export(
  2. tabname IN varchar2,
  3. cols IN array_t,
  4. vals IN array_t,
  5. rels IN array_t,
  6. path IN varchar2,
  7. file_name IN varchar2)
  8. IS
  9. l_file utl_file.file_type;
  10. tmp_file_name varchar2(4000) := file_name;
  11. begin
  12. IF (tmp_file_name LIKE '%.txt') then
  13. l_file := utl_file.fopen(path, tmp_file_name, 'w');
  14. elsif (tmp_file_name NOT LIKE '%.txt') then
  15. tmp_file_name := tmp_file_name || '.txt';
  16. l_file := utl_file.fopen(path, tmp_file_name, 'w');
  17. end IF;
  18. /*
  19.   tutaj muszę wywołać funckję get_cursor(p1, p2, p3, p4) i jej wynik zapisać do pliku txt.
  20.   */
  21. utl_file.fclose(l_file);
  22. end;


Bardzo proszę o pomoc, próbuję to zrobić od dwóch dni i nijak mi nie wychodzi.
wiiir
Cos w tym stylu?

  1. declare
  2. cur sys_refcursor
  3. ..
  4. ..
  5. rCur cur%rowtype;
  6. begin
  7. cur := get_cursor(....);
  8. loop
  9. fetch cur INTO rCur;
  10. exit when cur%NOTFOUND;
  11. ..
  12. ...
  13. ZAPIS DO PLIKU z rCur;
  14. end loop;



llepec
Wydaje mi się, że nie można czegoś takiego zrobić. Po pierwsze to deklarujesz zmienną rekordową rCur, która ma być typu cur, który jest zadeklarowany jako sys_refcursor.
Jednak do cur zwracane jest cokolwiek dopiero po deklaracjach, więc skąd niby ma być wiadomo jakie kolumny ma mieć rCur?
wiiir
W plsqlu wszystko mozna smile.gif

Jezeli podajesz zapytanie

  1. open cur FOR 'SELECT * FROM ' || tabname || ' ' || where_statement;


To wiadomo jakie kolumny
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.