Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> zapis do pliku returna (sys_refcursor) innej funkcji.
llepec
post 30.07.2013, 07:52:52
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wiiir
post 30.07.2013, 18:19:31
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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;



Go to the top of the page
+Quote Post
llepec
post 31.07.2013, 14:43:01
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?

Ten post edytował llepec 31.07.2013, 14:44:53
Go to the top of the page
+Quote Post
wiiir
post 6.08.2013, 17:33:35
Post #4





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


W plsqlu wszystko mozna smile.gif

Jezeli podajesz zapytanie

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


To wiadomo jakie kolumny
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 02:44