Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z transakcją
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
augiasz
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
W SQL nie ma IF'a - to jest w PL/pgSQL
augiasz
To jak to zrobic bez IF'a??
SongoQ
@augiasz Zamknij to w funkcje. I wtedy tylko zostanie CI wywolanie.
augiasz
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
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
Ewentualnie jak już koniecznie chcesz w zapytaniu to:
  1. SELECT CASE WHEN warunek THEN instrukcja WHEN warunek2 THEN instrukcja2 ELSE instrukcja3 END AS wynik FROM tabela;
AcidBurnt
zbłąkany miśku to zadziała na PG? ;]


hm... miłe...
SongoQ
@AcidBurnt Tak, tylko ze zamiast instrukcja w warunku powinno byc pole. No chyba ze pozniej jest rzutowanie przez type
Zbłąkany
@SongoQ: a nie może tam być też jakieś podzapytanie? W manualu nie piszą nic na ten temat i nie widze przykładu żadnego sad.gif .

Sprawdził to ktoś może?
SongoQ
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.