[Oracle, sqlplus] Wywolanie wyniku zapytania w sqlplus

0

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

0

A może "execute immediate"? czy takie rozwiązanie ci nie odpowiada?

0

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.

0

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;)

0

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.

0

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 :)

0

Wielkie dzieki za odpowiedzi!

1 użytkowników online, w tym zalogowanych: 0, gości: 1