1

Temat: like w funkcji

Witam
Mam taką funkcje, która nie wiem dlaczego nic nie zwraca, wszystko przez warunek where, bez warunku działa, a select bez funkcji z tym warunkiem działa.

funkcję wywołuję tak select * from fpobierz_szukaj_klienta('a',true)  -- drugi parametr teraz nie ma znaczenia

CREATE OR REPLACE FUNCTION "fpobierz_szukaj_klienta" (
  zm_klient VARCHAR, zm_aktywny boolean)
RETURNS SETOF tab_klienci AS
$body$
   declare
      dane tab_klienci%ROWTYPE;
  begin
      for dane in SELECT * FROM tab_klienci where upper(zamawiajacy) like upper('% zm_klient %')
      loop
          return next dane;
     end loop;
  end;
$body$
LANGUAGE 'plpgsql'
SECURITY DEFINER

znalazłem w sieci coś takiego like upper(''%'' || zm_klient || ''%''), ale wywołanie funkcji wywala błedy
ERROR:  operator is not unique: unknown % unknown
LINE 1: ...tab_klienci where upper(zamawiajacy) like upper(''%'' || zm_...
                                                             ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
QUERY:  SELECT * FROM tab_klienci where upper(zamawiajacy) like upper(''%'' || zm_klient || ''%'')
CONTEXT:  PL/pgSQL function "fpobierz_szukaj_klienta" line 4 at FOR over SELECT r


a taki warunek like upper(''%zm_klient%'')
ERROR:  operator does not exist: unknown % character varying
LINE 1: ...tab_klienci where upper(zamawiajacy) like upper(''%zm_klient...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY:  SELECT * FROM tab_klienci where upper(zamawiajacy) like upper(''%zm_klient%'')
CONTEXT:  PL/pgSQL function "fpobierz_szukaj_klienta" line 4 at FOR over SELECT rows

Nie mam pojęcia dlaczego to nie działa
Dzięki z góry za pomoc
AdamP.

Ostatnio edytowany przez adamleon (2011-01-29 20:28:34)

2

Odp: like w funkcji

Zrób tak

for dane in SELECT * FROM tab_klienci where upper(zamawiajacy) like upper('%'||zm_klient||'%')

3

Odp: like w funkcji

Dzięki, działa
A dlaczego w funkcji tak jest ?

4

Odp: like w funkcji

Nie rozumiem pytania?
Normalnie, znaczy w SQL, jest

SELECT ....FROM ... WHERE upper(zamiawiajacy) like upper('%kowalski%');

a w funkcji musisz dobrac nazwę klienta bo przeciez nie wiesz czy to będzie kowalski więc musisz skleić stringa do wyszukania

upper(zamiawiajacy) like upper('%'||zm_klienta||'%');

|| to operator sklejania (konkatenacji)
Ogólnie byłeś blisko rozwiązania tylko zamiast ' ' użyłeś " " a cudzysłów ma trochę inne znaczenie w postgresie (i w części innych baz tez)

5

Odp: like w funkcji

No nie zaskoczyłem :-)
W Accessie łącze   .." & zmienna & " ....

Dzięki za pomoc i wyrozumiałość

6

Odp: like w funkcji

smile
A w postgresie łączysz

'..'||zmienna||' ..'

ale musisz używać apostrofów a nie cudzysłowia.