TwojePC.pl © 2001 - 2024
|
|
A R C H I W A L N A W I A D O M O Ś Ć |
|
|
|
[PL/SQL] Jak zadeklarowac kursor, w ktorym czesc zapytanie bedzie konkatenacja stringow? , waski 2/06/08 19:27 Pytanie w zasadzie w temacie :)
Powiedzmy ze chce zadeklarowac kursor
CURSOR c IS
SELECT val1
from table
where val2 = 123
and sSQL;
gdzie sSQL to string zawierajacy dodatkowe warunki where do zapytania, ktore przekaze jako parametr dla kursora czy tez otrzymam przez wywolanie funkcji...
Jakby co baza to oracle (wersja 9 lub XE).SNAFU
Situation Normal, All Fucked Up - wydaje mi sie ze musisz uzyc typu REF CURSOR , HussaR 2/06/08 22:31
i całe zapytanie musi być lancuchem znakow.
W DECLARE:
TYPE typ_kursora IS REF CURSOR;
moj_kursor typ_kursora;
ciag_znakow VARCHAR2 := 'SELECT * FROM tabela';
W sekcji BEGIN END procedury:
OPEN cursor_name FOR ciag_znakow;Największym marzeniem człowieka jest latać i nie
spaść na ryj - dokładnie w ten deseń, jak to napisał HussaR , bwana 3/06/08 14:56
jest kilka innych sposobów (starszych i działających również na starszych wersjach bazy), ale ten jest na pewno ok dla 9, 10 i XE.
A skoro zaczynasz się bawić kursorami, zainteresuj się operacjami BULK i konstruktem FORALL - odkryjesz znaczny wzrost wydajności pl/sql nad czystym sql-em.
Dla przykładu wyimek z mojej ostatniej klepaniny (sprawozdawczość z kadr/płac do GUS):
function bulk_insert_proc(p_source_view_name in t_db_table_name, p_target_table_name in t_db_table_name) return t_dm_long_string is
l_chunk_size number := 10000;
begin
return
'
declare
type t_data is table of '||p_target_table_name||'%rowtype;
l_data t_data;
cursor c_data is select * from '||p_source_view_name||';
begin
open c_data;
loop
fetch c_data BULK COLLECT INTO l_data LIMIT '||l_chunk_size||';
FORALL i IN 1..l_data.COUNT
INSERT INTO '||p_target_table_name||' VALUES l_data(i);
EXIT WHEN c_data%NOTFOUND;
commit;
end loop;
close c_data;
commit;
end;
';
end;
Funkcja zwraca kod procedury, która wczytuje do kolekcji porcjami wiersze z podanego źródła i wstawia je do docelowej tabeli. To co zwraca funkcja uruchamiam EXECUTE IMMEDIATE i mam bardzo wydajne wstawienia wierszy (z view do tabeli) dzięki czemu zbieranie danych do self-made warehouse'a znacznie przyspieszyło. Polecam podręczniki wyd. O'Reilly."you don't need your smile when I cut
your throat" - dziekuje , waski 3/06/08 17:59
obu Panom :)
Ref cursor dziala ok a sugestie bwany moga sie przydac w przyszlosci :)SNAFU
Situation Normal, All Fucked Up |
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|