Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



ORACLE:Ako napisat vyraz pre where klauzulu?

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: DAB

20:39:09 05.08.2011

RomanZ Napsal:
-------------------------------------------------------
> Napsat podminku tak, aby se na sloupec filtrovalo
> jen kdyz je parametr vyplnen. Nenapisu to
> syntakticky spravne, ale pro pochopeni by to melo
> stacit:
>
> WHERE ((Parametr IS NULL) OR (Sloupec =
> Parametr))
>
> Do parametru se ale dava jen hodnota, nikoliv
> porovnavaci znamenko.

Nevím, jestli ještě odpovídám na dotaz tazatele, ale než takováto složená podmínka, to je lepší použít

where sloupec = nvl (:Parametr, sloupec)

viz třeba: [url]http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:759256700346344820[/url]

Oracle pak umí použít případný index.

Citovat příspěvek

 

Re: ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: David.Krch

16:58:51 05.08.2011

Pokud je podminka slozitejsi (velky pocet parametru podle kterych se muze ale nemusi filtrovat) a dotaz pracuje nad vetsim objemem dat, bylo by lepsi primo podminku generovat dynamicky. Jinak se vystavujete nebezpeci, ze podminka bude tak slozita, ze databaze bude muset cist celou tabulku.
Tj. zjistit jestli uzivatel vyplnil filtr pro policko A, pokud ano, pridat do filtru:
A=:a
Pokud uzivatel vyplnil policko B, pak do filtru pridat
AND B=:b

atd....

no a pak byste ty hodnoty do uzivatele naplnil do vazanych promennych (zase jen ty, ktere vam uzivatel zadal).

Uznavam, ze vam to bude generovat vetsi mnozstvi ruznych SQL textu, coz povede k trochu castejsimu parsovani (co unikatni kombinace filtrovanych sloupcu, to optimalizace), ale exekucni plan zas tam kde to pujde bude nejspis efektivnejsi. Navic uzivatele stejne obvykle pouzivaji jen par udaju, podle kterych filtruji.

Nesnazil bych se ale doplnovat do textu WHERE podminky primo hodnoty (tj. misto A=:a uvest primo A='hodnota_od_uzivatele') - nejen ze si pak musite davat pozor na SQL Injection, ale kazda unikatni hodnota od uzivatele vede na jiny text dotazu, coz vede pokazde k plne optimalizaci dotazu = pri castem spousteni pomerne vysoka rezie. Kazdopadne je rezie jeste vyssi, nez v predchozim pripadu.

Jak jsem tak rychle kouknul do Jasper Reports ([url]http://jasperforge.org/uploads/publish/ireportwebsite/IR%20Website/ir_using_parameters.html[/url]). Zda se, ze rozlisuji vkladani vazanych promennych pres $P{my_order_id} a vkladani do textu pres $P!{my_order_id}. Ja bych se tedy snazil vkladat co nejvice dat pres vazane promenne $P (bez vykricniku) - samozrejme tak nevlozite operatory, jen hodnoty.
Bylo by zajimave zjistit, jestli text, ktery dynamicky vlozite pres $P!{x} muze jeste samo o sobe obsahovat odkazy na vazane pomenne $P{x}. To by vam resilo elegantne oboji :-).

Jasper neznam, ale nasel jsem par odkazu, ktere by vam mohli pomoct. Zda se, ze lze menit i vlastni SQL text i posilane parametry.
[url]http://stackoverflow.com/questions/652486/dynamic-querystring-in-jrxml[/url]
[url]http://www.coderanch.com/t/523321/open-source/JasperReport-Dynamic-SQL-Query-inside[/url]

Vasemu puvodnimu pristupu by asi odpovidal tento postup, ale moc mi nesedi (prave proto, ze vklada uzivatelske hodnoty primo do textu SQL:
[url]http://www.robsprogrammingjunk.com/2009/07/dynamic-query-parameters-for-jasper.html[/url]

Citovat příspěvek

 

Re: ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: Maaartin

12:54:09 05.08.2011

> [ital]Zatial mam taketo riesenie:
WHERE DeviceID || 'X' = DeviceID || 'X'[/ital]

A neni to nahodou blbe? Pro NULL to musi vracet NULL, takze sis nic nepomohl.

> [ital]Akorat to zafunguje samozrejme pouze pokud mate pouze jeden sloupec a jeden parametr, popripade, pokud mate vyberovy vyraz pro kazdy sloupec uzavren v zavorce (coz je temer nutnost)[/ital]

Urcite bych to zavorkoval.

> [ital]v tom pripade doplnte parametr
sloupec = cokoliv_krome_null OR 1=1[/ital]

Proc ne NULL? Neni snad sloupec=NULL OR 1=1 rovno NULL OR TRUE rovno TRUE?

Citovat příspěvek

 

Re: ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: grafnev

10:03:46 05.08.2011

Akorat to zafunguje samozrejme pouze pokud mate pouze jeden sloupec a jeden parametr, popripade, pokud mate vyberovy vyraz pro kazdy sloupec uzavren v zavorce (coz je temer nutnost)

Citovat příspěvek

 

Re: ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: grafnev

10:02:00 05.08.2011

v tom pripade doplnte parametr
sloupec = cokoliv_krome_null OR 1=1

parametr bude tedy:
cokoliv_krome_null OR 1=1

Citovat příspěvek

 

Re: ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: RomanZ

13:31:31 04.08.2011

Napsat podminku tak, aby se na sloupec filtrovalo jen kdyz je parametr vyplnen. Nenapisu to syntakticky spravne, ale pro pochopeni by to melo stacit:

WHERE ((Parametr IS NULL) OR (Sloupec = Parametr))

Do parametru se ale dava jen hodnota, nikoliv porovnavaci znamenko.

Citovat příspěvek

 

ORACLE:Ako napisat vyraz pre where klauzulu?

Autor: metalpalo

11:35:25 04.08.2011

Zdravim

Mam SELECT query v reportoch(JASPER) a v nich doplnam urcite casti podmienky(WHERE) podla zvolenych kriterii(uzivatel odfiltruje data ktore chce vidiet, napr zvoli deviceID = 20).

Napr. WHERE klauzula moze vypadat takto:
WHERE DeviceID $!{P_DEVICEID}

Moj program na zaklade zvolenych dat nastavi hodnoty pre parametre v selecte.

Napr. uzivatel zvoli zariadenie 20, potom moj program nastavi da parametra P_DEVICEID vyraz: "=20"

V pripade ze uzivatel nepouzije filter pre zariadenie potrebujem nastavit do toho parametra nejaku defaultnu hodnotu ktora zaruci ze sa nic nebude filtrovat. To znamena aby podmienka bola splnena vzdy.

pri pokuse dat tam vyraz: "=DeviceID" to zahra iba v pripade ze stlpec DeviceID nema hodnotu null v ziadnom riadku. Inka mi tieto riadky odfiltruje.

Ma niekto nejaky napad co tam pouzit? Podotykam ze tam nechcem davat ziadne zatvorky pre nazov stlpca, alebo to davat do nejakych funkcii. Cely vyraz sa musi nachadzat za filtrovanym stlpcom(iba v parametri).

Zatial mam taketo riesenie:
WHERE DeviceID || 'X' = DeviceID || 'X'

to znamena ze parameter by obsahoval hodnotu: 'X' = DeviceID || 'X'

Ma niekto este nejake lepsie riesenie ktore sa da zapisat cele za dany stlpec?


dik

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: