[ miličić.marko @ 20.04.2007. 23:27 ] @
Imam neku tabelu na primer (KORISNICI) koja ima kolone: id, ime i prezime.
Kako napisati stored proceduru koja ce mi za zadato ime i prezime vratiti id korisnika a ukoliko taj korisnik ne postoji, prvo ce ga insertovati za zatim vratit njegov ID.


Hvala
[ chachka @ 21.04.2007. 00:11 ] @
Predpostavljam da ti je id definisan kao serial tip.
Evo ti telo funkcije
Code:

-- p_ime = ulazni parametar - ime korisnika
-- p_prezime = ulazni parametar - prezime korisnika

DECLARE

  l_id INTEGER;

BEGIN

  LOOP

    -- potrazi id korisnika sa zadatim imenom i prezimenom
    SELECT INTO l_id
           id
      FROM korisnici
     WHERE ime = p_ime
       AND prezime = p_prezime;

    -- ako postoji odgovarajuci korisnik,
    -- vrati njegov id i izadji iz funkcije
    IF FOUND THEN
      RETURN l_id;
    END IF;  

    -- posto korisnik ne postoji, ubaci ga 
    INSERT INTO korisnici (ime, prezime)
    VALUES (p_ime, p_prezime);

  END LOOP;

END;
[ miličić.marko @ 23.04.2007. 09:29 ] @
Hvala na pomoci, ali imam jedan problem. Naime, posto prezime nije obavezno, ono moze biti NULL a kada null dodje kao argument funkcije, onda sintaksa SELECT i INSERT querija nije dobra jer se ocekuje nesto tipa "IS NULL" a ne "= NULL". Cackao sam po konfig fajlu POSTGRESQL-a i nasao opciju koja konvertuje = NULL u IS NULL. Iz phpmyadmin-a sve radi kako treba ali iz stored procedure nece. Ima li logike da se kveri iz stored procedure drugacije ponasa od externog querija? ili nesto drugo nije uredu.

Hvala unapred
[ chachka @ 23.04.2007. 10:24 ] @
1. Napravi grananje procedure u zavisnosti da li je prezime NULL ili nije.

2. Ima logike za razlicito ponasanje. To sto si podesio da ti upiti umesto IS NULL korise =NULL ne znaci da si podesio da ti to vazi i za PL/pgSQL.

3. To sto si ukljucio transform_null_equals unistava celu logiku koja stoji iza specijalne vrednosti NULL.
Na primer:
Ispravno je da NULL AND NULL = NULL, jer se to interpretira kao: NEPOZNATO I NEPOZNATO. Pa to je i dalje NEPOZNATO!
Posto si ti ukljucio gore pomenutu opciju dobijas:
NULL AND NULL = TRUE Dobijas da je NEPOZNATO I NEPOZNATO tacno?!?
[ miličić.marko @ 23.04.2007. 13:39 ] @
Hvala na savetu, ali stvar se komplikuje kada imam 5 parametara i 3 od njih mogu biti NULL? Telo funkcije bi postalo i suvise komplikovano.... ukoliko bih dinamicki kreirao query koji se izvrsava izgubio bih na performansama jer se plan izvrsavanja ne bi pamtio vec bi se prilikom svakog pozivanja racunao ponovo?

Sta predlazes kao resenje?
[ chachka @ 23.04.2007. 14:21 ] @
Za pocetak, posalji celu DDL skriptu za kreiranje tabele.

Dalje, koliko to korisnika ocekujes da ces imati u tabeli? Kojim tempom ce biti ubacivani novi korisnici (5 korisnika u minuti, 2 korisnika svake sekunde, ...)?
[ miličić.marko @ 23.04.2007. 23:58 ] @
Ocekujem ogromno opterecenje nad tom tabelom.. reda velicine 100-1000 u sekundi. Korisnike sam naveo kao primer radi se o necem drugom :) Hvala ti puno na odgovorima i pomoci.