augiasz
22.06.2007, 19:47:22
Pomóżcie!Ma to byc transakcja przy rezerwacji ksiazek w bibliotece,najpierw ma sprawdzac czy liczba wypozyczonych ksiazek przez klienta przekracza 10 jesli tak to koniec.Potem jesli liczba dostepnych egzemplarzy jest 0 to tez lipa.u_id i k_id to identyfikatory uzytkownika i ksiazki.Przypisuje je do zmiennej gdzie maja byc przechowywane te identyfikatory(interfejs ma byc w PHP).Ale wywala sie juz w pierwszym IF!!Co jest nie tak??
BEGIN;
IF (SELECT l_wyp_ks FROM uzytkownicy WHERE u_id = $zmienna ) >=10 THEN
RAISE NOTICE "Nie mozesz wypozyczyc zadnej ksiazki!" ROLLBACK;
ELSE
IF (SELECT l_dost_egz FROM ksiazki WHERE k_id = $zmienna) = 0 THEN
RAISE NOTICE "Ta ksiazka nie jest dostepna!" ROLLBACK;
ELSE
UPDATE ksiazki SET l_dost_egz = l_dost_egz - 1 WHERE k_id =$zmienna;
UPDATE uzytkownicy SET l_wyp_ksiazek = l_wyp_ksiazek + 1 WHERE u_id = $ zmienna;
END IF;
END IF;
COMMIT;
prond
22.06.2007, 20:22:16
W SQL nie ma IF'a - to jest w PL/pgSQL
augiasz
22.06.2007, 20:59:31
To jak to zrobic bez IF'a??
SongoQ
22.06.2007, 22:51:25
@augiasz Zamknij to w funkcje. I wtedy tylko zostanie CI wywolanie.
augiasz
22.06.2007, 22:58:52
Mogłbys to sprecyzowac?? W ogole to w Postgresie nie moze byc IFów,chyba ze w triggerze jak okreslamy język...,ale tu...
SongoQ
22.06.2007, 23:03:32
Kod ktory podeslales na forum to nie jest SQL to jest plpgsql, a tam juz jest inna skladnia. SQL to jezyk zapytan. Zeby to Ci zadzialalo to zamknij to w funkcje lub w procedure.
Zbłąkany
24.06.2007, 19:18:29
Ewentualnie jak już koniecznie chcesz w zapytaniu to:
SELECT CASE WHEN warunek THEN instrukcja WHEN warunek2 THEN instrukcja2 ELSE instrukcja3 END AS wynik FROM tabela;
AcidBurnt
25.06.2007, 19:00:19
zbłąkany miśku to zadziała na PG? ;]
hm... miłe...
SongoQ
25.06.2007, 23:19:04
@AcidBurnt Tak, tylko ze zamiast instrukcja w warunku powinno byc pole. No chyba ze pozniej jest rzutowanie przez type
Zbłąkany
26.06.2007, 06:39:50
@SongoQ: a nie może tam być też jakieś podzapytanie? W manualu nie piszą nic na ten temat i nie widze przykładu żadnego

.
Sprawdził to ktoś może?
SongoQ
26.06.2007, 07:48:00
Podzapytanie oczywiscie ze moze byc. Moze byc tam co chesz tylko wazne ze to ma zwracac 1 pole/wartosc. Ale da sie caly rekord z wykorzystaniem rzutowania. Sa przyklady w manualu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.