Witam, mam taki problem. Musze zrobic cos takiego, ze loguje sie do sqlplusa, wywoluje funkcje na serwerze oracla ktora zwraca mi string / zapytanie, dynamicznie stworzone. Nastepnie, chce to zapytanie wykonac, w obrebie tego samego sqlplusa. Czy sie da to zrobic?
Obecnie jest tak ze wynik funkcji jest spoolowany do pliku zewnetrznego, a nastepnie jest wykonywany ten plik jako skrypt sql, poprzez uzycie @skrypt_tymczasowy. Nie podoba mi sie to, moze da sie to inaczej jakos elegancko rozwiacac? A moze to jest wlasine elegancko a ja sie nie znam?
Pozdro
A może "execute immediate"? czy takie rozwiązanie ci nie odpowiada?
Jesli zadziala tak jak chce, to odpowiada jak najbardziej. Jednakze, probowalem cos z tym zrobic ale nie udalo mi sie. Moze pokaze dokladniej o co mi chodzi i ktos ze specjalistow pomoze mi to napisac:
mam skrypt.sql, a w nim:
select pkg.funkcja() -- to zwraca mi string bedacy sqlem
teraz musialbym ten string bedacy wynikiem jakos gdzies zapisac, do jakiejs zmiennej, i nastepnie wykonac sql ktory pod ta zmienna sie chowa. Nie mam zielonego pojecia jak to zrobic. Na chwile obecna w pliku mam wywolanie spool do pliku. Czyli teraz wyglada jakos tak:
set echo off
set feedback off
set verify off
set sqlprompt ''
set spooltrim on
spool &1 -- zapisz wynik zapytania do pliku
select pkg.funkcja()
@&1 -- wywolaj skrypt z pliku
Powyzszy skrypt jest wywolywany w bashu, plik tymczasowy podany jako parametr, po powrocie z sqlplusa plik tymczsowy jest usuwany.
Jak by to zatem moglo wygladac z execute immediate?
Dodam tylko ze jestem dosc poczatkujacy w plsql i narzedziach oracla, dlatego moze haslo execute immediate mi nic nie mowi, a powinno.
Pozdrawiam i dzieki.
Przy pomocy polecenie execute immediate można wywołać polecenie sql bezpośrednio z poziomu funkcji pl/sql dynamiczne tworzone np. poprzez sklejanie polecenia z kilku stringów.
Robi się to tak (w uproszczenie): budujesz zapytanie, potem piszesz
execute immediate nazwa_stringa
i gotowe - funkcja pl/sql wywoła odpowiednie zapytanie.
Znajdziesz naprawdę wiele przykładów w necie;)
Dzieki za pomoc, jak wroce do pracy to pokombinuje z tym. Jest tylko jedno ale - to zapytanie dynamiczne jest wynikiem funkcji plsql, czyli jest zwracane jako wynik zapytania. Czy da sie zrobic tak zeby wynik zapytania zapisac do zmiennej, a pozniej ta zmienna wykonac jako zapytanie? Cos w stylu:
DECLARE sql = select pkg.funkcja_plsql() from dual;
execute immediate sql;
Pozdrawiam.
Proponuję napisac skrypt skrypt.sql którego zawartośc będzie poniższa:
DECLARE
vv_SqlCommand VARCHAR2(32760);
BEGIN
vv_SqlCommand := pkg.funkcja(); -- tu przypisujesz wybik twojej funkcji do zmannej
EXECUTE IMMEDIATE vv_SqlCommand;
END;
/
Powyzsze skrypt zrealizuje twoj problem. Jeśli twoja funkcjia zwraca text np. "select count(*) from tabel" to mozesz przechwycic wynik, zgodnie z poniższym:
EXECUTE IMMEDIATE 'select count(*) from tabel' INTO zmiennna;
Przechwycic mozna wyniki róznie zz funkcji :)
Wielkie dzieki za odpowiedzi!