Witam W jaki sposob drodzy grupowicze realizujecie zapytania opakowane w fukcje na oraclu np cos takiego
tabela
ogloszenia ( p_coutry number p_city number, p_typ number, p_area number, p_price number );
function Get_count_ogloszenia( COUNTRY number , CITY number , PRICE_FROM number ,PRICE_UNTIL) return number;
problem lezy w tym ze developer niektore wartosci podaje lub nie np moze wywolac funkcje tak
Get_count_ogloszenia(null, null,null, );
oczekujac ze funkcja zadziała jakby w srodku niej bylo select count (*) from ogloszenia where p_price > ;
Obecnie buduje zapytanie w pl sql uzywajac dynamic sql łączac Varchary w zapytanie i robiac 'EXECUTE IMMEDIATE', nie moge bindowac gdyz teoretycznie nie wszystkie wartosci sa zawsze uzyte takze USING mi odpada , powstaje mi taki literalowy twor , ktory jest ciagle twardo parsowany, Czy jest jakis sposob na uniwersalna i elegancka wersie zapytania , czy istnieje jakas forma zapisu abym w zapytaniu mogl podac np konkretne ID_MIASTA albo porownanie to zostanie zignorowane
DYNAMIC SQL - oracle 10
Witam W jaki sposob drodzy grupowicze realizujecie zapytania opakowane w fukcje na oraclu np cos takiego
tabela
ogloszenia ( p_coutry number p_city number, p_typ number, p_area number, p_price number );
function Get_count_ogloszenia( COUNTRY number , CITY number , PRICE_FROM number ,PRICE_UNTIL) return number;
problem lezy w tym ze developer niektore wartosci podaje lub nie np moze wywolac funkcje tak
Get_count_ogloszenia(null, null,null, );
oczekujac ze funkcja zadziała jakby w srodku niej bylo select count (*) from ogloszenia where p_price ;
Obecnie buduje zapytanie w pl sql uzywajac dynamic sql łączac Varchary w zapytanie i robiac 'EXECUTE IMMEDIATE', nie moge bindowac gdyz teoretycznie nie wszystkie wartosci sa zawsze uzyte takze USING mi odpada , powstaje mi taki literalowy twor , ktory jest ciagle twardo parsowany, Czy jest jakis sposob na uniwersalna i elegancka wersie zapytania , czy istnieje jakas forma zapisu abym w zapytaniu mogl podac np konkretne ID_MIASTA albo porownanie to zostanie zignorowane
feyd
WHERE (country = :COUNTRY or :COUNTRY is null) and (city = :city or :city is null)
Tylko to w Twoim przypadku nie będzie korzystać z indexów, ale podaje bo czasami się opłaca tak zrobić. Jeśli musisz 'zarobić' trochę czasu na parsowaniu, to nie masz innego wyjścia tylko rozbić to swoje EXECUTE na 16 przypadków. ;)
problem lezy w tym ze developer niektore wartosci podaje lub nie np moze wywolac funkcje tak Get_count_ogloszenia(null, null,null, ); oczekujac ze funkcja zadziała jakby w srodku niej bylo select count (*) from ogloszenia where p_price ; Obecnie buduje zapytanie w pl sql uzywajac dynamic sql łączac Varchary w zapytanie i robiac 'EXECUTE IMMEDIATE', nie moge bindowac gdyz teoretycznie nie wszystkie wartosci sa zawsze uzyte takze USING mi odpada , powstaje mi taki literalowy twor , ktory jest ciagle twardo parsowany, Czy jest jakis sposob na uniwersalna i elegancka wersie zapytania , czy istnieje jakas forma zapisu abym w zapytaniu mogl podac np konkretne ID_MIASTA albo porownanie to zostanie zignorowane
feyd napisał:
Zamiast EXECUTE IMMEDIATE trzeba użyć pakietu dbms_sql. Ladnie opisal to Tom Kyte w Expert One-on-One. Buduje sie trzy array dla warunkow WHERE (nazwa kolumny, operator, wartosc) i nastepnie tworzy SQL w pętli wykorzystujac nazwę kolumny i operator. Kolejna pętla za pomocą procedury dbms_sql.bind_variable łączy wartości.
W takich przypadkach można też tworzyć (i w sumie jest to prostsze) SQL+bind o etap wyzej - czyli np. w PHP.
Pozdrowienia, Lucyna Witkowska