Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Stored procedura koja vraca result set

[es] :: Oracle :: Stored procedura koja vraca result set

[ Pregleda: 6274 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MrNash

Član broj: 200926
Poruke: 155
192.102.17.*



Profil

icon Stored procedura koja vraca result set17.07.2013. u 14:50 - pre 130 meseci
Pozdrav!

Potrebno je napraviti Oracle stored proceduru koja bi vracala "result set" koji bi sadrzao tri kolone (datum i dvije numericke vrijednosti).
Vrijednost za te dvije numericke kolone je potrebno izracunati u petlji u okviru same procedure.

To jest, u okviru svake iteracije treba izracunati te dvije vrijednosti (za zadati datum) i onda ih nekako zapamtiti kako bi se na kraju
procedure pokazao kompletan result set.

Kako je to najlakse izvesti?

Mislio sam da koristim privremene tabele i da u svakoj iteraciji insert-ujem slog u tu tabelu (nakon sto bih izracunao sve sto treba)
i da na kraju procedura samo vrati sadrzaj te privremene tabele. Medjutim izgleda da je u Oracle-u
drugacija prica kada su privremene tabele u pitanju (u odnosu na MS SQL Server). Treba ih kreirati izvan procedure itd...

 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 15:17 - pre 130 meseci
Pogledaj: http://www.elitesecurity.org/t416902-0#2759058
ili recimo ovde: http://www.oracle-base.com/art.../pipelined-table-functions.php

Koristi se PIPELINED funkcija. gorshtak je lepo odradio primer. Napravi se object tip sa tri polja koja ti trebaju, a zatim tip table of object. Funkcija treba da vrati table of object pipelined. Individualni slog se upisuje sa pipe row. Selektuje se sa select * from table(poziv_pipelined_funkcije(argumenti)).

Pitanje je da li ti je stvarno potrebna pipelined funkcija, ili to što tebi treba može na oracle bazi da se reši na prostiji (drugačiji) način nego što si navikao na MSSQL-u.
 
Odgovor na temu

MrNash

Član broj: 200926
Poruke: 155
192.102.17.*



Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 15:29 - pre 130 meseci
Hvala, pogledacu.

Ne znam kako bih drugacije to izveo. Razmisljao sam da napravim korisnicku funkciju koja bi racunala numericke vrijednosti
(gdje bi datum bio ulazni parametar).
Fora je sto ni te datume nemam kao kolonu u tabeli vec je potrebno napraviti while petlju (od pocetnog do krajnjeg datuma).
 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 15:41 - pre 130 meseci
Mozes ovako kako je djoka_l naveo, a mozes da koristis global temporary table. U njoj se cuvaju podaci za tu sesiju, inace sve ostalo radis kao sa obicnom tabelom. Ne znam sta znaci da se kreira tabela van procedure (create/drop ?)
Evo kratko primer sintakse za global temporary table:

http://www.oracle-base.com/articles/misc/temporary-tables.php

Za to sto tebi treba koristi opciju ON COMMIT PRESERVE ROWS
 
Odgovor na temu

MrNash

Član broj: 200926
Poruke: 155
192.102.17.*



Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 15:49 - pre 130 meseci
http://stackoverflow.com/quest...for-temporary-tables-in-oracle

Pise:
"If you really wanted to use temporary tables in Oracle, you would not create the table dynamically.
You would create a global temporary table before you created the stored procedure."

pa je onda naveden kod. Po tome privremenu tabelu je potrebno napraviti kad i proceduru (a ne dinamicki tokom
izvrsavanja procedure). Da li onda tabela ostane u bazi i nakon izvrsenja procedure? Ako jeste tako onda nije bas
"privremena".
 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 15:54 - pre 130 meseci
Da, ona ti je objekat u bazi kao i 'obicna' tabela. Jedina razlika je sto Oracle sam pobrise redove kada sesija vise nije aktivna. U principu mozes to i sam da napravis sa obicnom tabelom (kreiras neki id za tu sesiju, pa pobrises slogove za taj id kada zavrsis posao) ali ovo ti je sigurnije, posto ti je zagarantovano da ce se transakcija zavrsiti.
 
Odgovor na temu

MrNash

Član broj: 200926
Poruke: 155
192.102.17.*



Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 15:55 - pre 130 meseci
OK, hvala. Razmotricu sta mi je ciniti.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 16:34 - pre 130 meseci
Ako ti trebaju svi datumi, na primer, od 1 maja do 31 maja ne moraš da praviš while petlju:

Code (sql):

SELECT to_date('01-05-2013', 'dd-mm-yyyy')+rownum-1
FROM dual
CONNECT BY rownum <= to_date('01-06-2013', 'dd-mm-yyyy')-to_date('01-05-2013', 'dd-mm-yyyy')
 

Bolje nam reci šta ti treba, sigurno postoji bolji način nego što si zamislio...
 
Odgovor na temu

MrNash

Član broj: 200926
Poruke: 155
*.adsl.highway.telekom.at.



Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 18:02 - pre 130 meseci
Hvala jos jednom, probacu sa privremenom tabelom.
 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 20:02 - pre 130 meseci
Ovo je algoritam

Kreiras tabelu:

create global temporary table tab1 (datum date, broj1 number, broj2 number)
on commit preserve rows;

Procedura radi nesto sa tom tabelom:

create or replace procedure proc1
begin
insert into tab1...
update tab1...
commit;
end;

Tvoj program:

begin
proc1;
select * from tab1;
end;

Dok si u programu vidis podatke koje je napravila procedura. Ostali te tvoje trenutne podatke ne vide. Kada izadjes iz programa tih podataka vise nema.
Preciznije, kada se diskonektujes sa servera nema vise podataka. Ako ti dok si u sesiji opet zatrebaju podaci iz te tabele mozda ti zatreba brisanje iz tabele. Evo primer dole:

begin
proc1;
select * from tab1;
delete from tab1;
commit;
proc1;
select * from tab1;
end;

Nadam se da ce ovo pomoci.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 20:16 - pre 130 meseci
Sve je OK što je brzak rekao, samo što ja to ne bih tako radio...
A onaj COMMIT mi strašno bode oči. Postoji pragma autonomous_transaction ako želiš da "izoluješ" commit samo za tu proceduru, ali i dalje smatram da imaš konceptualni problem - pokušavaš da mehanički preslikaš MSSQL logiku rada na ORACLE. Rezultat je katastrofa u najavi.
 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 20:20 - pre 130 meseci
Slazem se za autonomnu transakciju, sve zavisi kako ostatak aplikacije radi
 
Odgovor na temu

MrNash

Član broj: 200926
Poruke: 155
*.adsl.highway.telekom.at.



Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 21:08 - pre 130 meseci
Konsultovacu se jos sa nekim kolegama u vezi ovoga, mada mislim da ce mi biti potrebna jos jedna
tabela u bazi (ili "obicna" ili privremena).
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Stored procedura koja vraca result set17.07.2013. u 21:44 - pre 130 meseci
Šta kaže Tom Kyte u vezi temporary tabela http://asktom.oracle.com/pls/a...UESTION_ID:5824706700346810645

Citat:
I agree that you shouldn't use a temporary table if you can use an inline view or a with subquery.

that is - don't fall into a sqlserver programmer paradigm in Oracle - it is OK to join lots of tables in a single query - we prefer that.

If you do use a global temporary table and query it - you will need to address the statistics. There are a few approaches
 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.static.isp.telekom.rs.



+64 Profil

icon Re: Stored procedura koja vraca result set18.07.2013. u 08:04 - pre 130 meseci
Procitao sam ovo sa Ask Tom linka, uglavnom se vrti oko toga da su ljudi koristili temp tabele (u drugim bazama) da bi veliki query podelili na manje, praveci privremene result set-ove, pa onda to spajali na kraju...

Takodje, na kraju se pominje WITH sa kojim nemam iskustva (postoji izgleda od verzije 11.1), za koji na http://psoug.org/reference/with.html kazu "A WITH clause is really best used when the result of the WITH query is required more than one time in the body of the query such as where one averaged value needs to be compared against two or three times.", sto pretpostavljam da znaci da baza sama odlucuje sta ce i kada staviti u neku temp tabelu (TK: "and they can and will when necessary create temporary tables for that query").

Dakle, to je neka opsta prica o temp tabelama i kako se koriste za velike upite. Ovde se radi o necemu drugacijem: potrebno je izvrsiti racun (sa petljom) pre vracanja podataka, i za to zaista nema nista bolje od pipelined funkcija, kao sto je vec receno.

Sto se tice zabune oko naziva temporary, ocigledno da se u Oracle-u to odnosi na podatke u tabeli a ne na samu tabelu. Dakle, tabela postoji dok se ne dropne :) a podaci su ograniceni na sesiju. Iz reference-a: "Specify GLOBAL TEMPORARY to indicate that the table is temporary and that its definition is visible to all sessions with appropriate privileges. The data in a temporary table is visible only to the session that inserts the data into the table.".
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Stored procedura koja vraca result set18.07.2013. u 09:59 - pre 130 meseci
WITH klauzula postoji odavno, a od verzije 11.2 (a ne 11.1) postoji i rekurzivni with.

Primer klauzule with:

with x as (select 1 from dual)
select * from x;

Primer rekurzivnog with (tip je napisao program koji rešava sudoku jedim upitom):

http://technology.amis.nl/2009...-recursive-subquery-factoring/
 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.static.isp.telekom.rs.



+64 Profil

icon Re: Stored procedura koja vraca result set18.07.2013. u 10:24 - pre 130 meseci
Da, sada sam video, izgleda od verzije 9.2, zbunilo me sto nisam nasao u svom ref. kao samostalnu klauzulu, nalazi se u okviru select-a (koji je grandiozan :) ), sto je i logicno.
U svakom slucaju, na http://www.oracle-base.com/articles/misc/with-clause.php ima dobar (uvodni) tekst na tu temu. Upit koji si napisao je verovatno isti kao i

select * from (select 1 from dual) x;

ali se prava korist vidi tek kada neki inline view zelimo da vise puta ponovimo u upitu. Dakle, WITH radi neku vrstu izdvajanja zajednickog upita radi optimizacije, a baza moze da odluci i da napravi temp tabelu, pri cemu joj se to moze sugerisati hintom /*+ MATERIALIZE */ ili obrnuto, hintom /*+ INLINE */.

Pored toga, a to se kaze i na Ask Tom sajtu, koriscenje WITH-a moze poboljsati citljivost upita, primer opet postoji i na prethodnom linku.
 
Odgovor na temu

MrNash

Član broj: 200926
Poruke: 155
192.102.17.*



Profil

icon Re: Stored procedura koja vraca result set19.07.2013. u 13:13 - pre 130 meseci
Nakon konsultacija sa kolegama zakljucili smo da nam pravljenje nove tabele za ovaj zadatak ne odgovara jer ce biti
jos slicnih izvjestaja, sto bi znacilo da bismo za svaki sljedeci morali da pravimo novu tabelu u bazi (ili "obicnu" ili privremenu - koja u stvari nije privremena).

Izvjestaj smo realizovali pomocu funkcije, slicno primjeru "Pipelined Table Functions" navedenom na stranici
http://www.oracle-base.com/art.../pipelined-table-functions.php. It works!!!

Hvala jos jednom.


 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: Stored procedura koja vraca result set28.07.2013. u 12:06 - pre 129 meseci
Kreiranje tabele ne bi trebalo da bude presudno pri odluci koji pristup koristiti (svakako nisi spasen od kreiranja tipa), nego velicina kolekcije. U slucaju malih kolekcija pipelined funkcija je super, ali ako vracas veliku kolekciju, i jos hoces da uradis neki order by po nekoj koloni, ili grupnu funkciju i sl, onda je ipak bolje koristiti tabelu. Sta je velika kolekcija je diskutabilno, ali recimo da ako zauzme > 1GB RAM, opet moras da razmisljas o tome koji pristup da koristis.
 
Odgovor na temu

[es] :: Oracle :: Stored procedura koja vraca result set

[ Pregleda: 6274 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.