<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Błąd w procedurze, triggerze. Pilne.]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1199</link>
		<description><![CDATA[Najświeższe odpowiedzi w Błąd w procedurze, triggerze. Pilne..]]></description>
		<lastBuildDate>Thu, 19 Jan 2012 09:53:54 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Błąd w procedurze, triggerze. Pilne.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3364#p3364</link>
			<description><![CDATA[[quote=lito77]Jak zrobić aby na updateowanej krotce wprowadzić zmiany w moim przypadku wstawić opis='uwaga, kończy się'. Procedura dodaje mi krotke a tego niechcę.[/quote]

O ile ksiazkaid została została określona jako Primary Key, czy ew. Unique, to rzeczywiście taki update opiera się na [b]pojedynczej[/b] krotce, w przeciwnym razie zauważ, że FOR EACH ROW może spowodować operację na kilku krotkach. Procedura dodaje krotkę wtedy i tylko wtedy gdy ilosc (ustawiana w Update'cie) jest mniejsza od dwóch lub większa od dwudziestu (czyli tak jak zapisano w funkcji wpis()). Zauważ, że trigger został określony jako [b]AFTER UPDATE[/b], czyli najpierw wykona się Update (aktualizacja krotki tj. ustawienie ilosci), a potem [b]ewentualnie[/b] wykona się Insert (czyli dodanie nowej krotki).]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Thu, 19 Jan 2012 09:53:54 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3364#p3364</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Błąd w procedurze, triggerze. Pilne.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3362#p3362</link>
			<description><![CDATA[Dzięki za odpowiedź. Narazie trigger i funkcja wygląda tak:

CREATE FUNCTION wpis()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.ilosc < 2                                                                             
THEN INSERT INTO magazyn VALUES (old.ksiazkaid, new.ilosc, 'uwaga, kończy się');
END IF;   
IF NEW.ilosc > 20    
THEN INSERT INTO magazyn VALUES (old.ksiazkaid, new.ilosc, 'ale tego  tu jest');                                                                        
END IF;
RETURN NEW;
END
$$ LANGUAGE 'plpgsql'
;


CREATE TRIGGER wpis_w_opis
AFTER UPDATE ON magazyn
FOR EACH ROW EXECUTE PROCEDURE wpis();


Ładuje się bez problemu ale...
Problem nastepny z tym zwiazany to to, że jka robię update:

UPDATE magazyn SET ilosc=1 WHERE ksiazkaid=2;

to wstawia mi krotkę gdzie ilosc=1, ksiazkaid=2, opis='uwaga, kończy się'
a oprócz tego wstawia mi to samo ale z opis=''

Nie wiem jak to ugryźć, coś mi swita, że to wynika z funkcji, z insertu w niej...

Jak zrobić aby na updateowanej krotce wprowadzić zmiany w moim przypadku wstawić opis='uwaga, kończy się'.
Procedura dodaje mi krotke a tego niechcę. Pomóżcie proszę jutro muszę to skończyć. No tak, jest po 00:00 więc dzisiaj :(]]></description>
			<author><![CDATA[dummy@example.com (lito77)]]></author>
			<pubDate>Wed, 18 Jan 2012 21:12:27 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3362#p3362</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Błąd w procedurze, triggerze. Pilne.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3361#p3361</link>
			<description><![CDATA[Błąd (literówka) znajduje się w ciele funkcji wpis(), nie możesz otwierać drugiego IF'a bez END IF dla pierwszego, ja bym zamienił:

[code]IF NEW.ilosc > 20[/code]

na:

[code]ELSEIF NEW.ilosc > 20[/code]

i powinno śmigać, ew. przejrzyj też [url]http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS[/url]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Wed, 18 Jan 2012 18:38:56 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3361#p3361</guid>
		</item>
		<item>
			<title><![CDATA[Błąd w procedurze, triggerze. Pilne.]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3360#p3360</link>
			<description><![CDATA[Witajcie.
Mam problem z ostatnim zadaniem w moim pierwszym projekcie, czyli triggerem. Całą bazę zrobiłem, wszystko działa, zapytania śmigają. Podaje niżej tworzoną tabelę i procedurę wraz z triggerem do niej. I tu jest problem. Wywala błąd do procedury:

ERROR:  syntax error at or near ";"
LINE 10: END;
                   ^

create table magazyn
( ksiazkaID int not null,
  ilosc int not null,
  opis varchar(50),
  CONSTRAINT ksiazki_fk FOREIGN KEY (ksiazkaID) REFERENCES ksiazki(ksiazkaID)
);


CREATE FUNCTION wpis()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.ilosc < 2	                                                                         
THEN INSERT INTO magazyn VALUES (old.klientid, new.ilosc, 'uwaga, kończy się');
IF NEW.ilosc > 20	
THEN INSERT INTO magazyn VALUES (old.klientid, new.ilosc, 'ale tego tu jest');                                                                        
END IF;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql'
;


CREATE TRIGGER wpis_w_opis
BEFORE UPDATE ON magazyn
FOR EACH ROW PROCEDURE wpis();

Prubowałem juz wszystkiego i nie daje rady. Wygląda na banalny problem ale mnie zmurowało. Proszę o pomoc. Jutro cały projekt muszę wysłać a zostało mi tylko zrobić procedure i triggera. Z góry dziękuje.]]></description>
			<author><![CDATA[dummy@example.com (lito77)]]></author>
			<pubDate>Wed, 18 Jan 2012 16:28:29 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3360#p3360</guid>
		</item>
	</channel>
</rss>
