<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Błąd w procedurze, triggerze. Pilne.]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1199&amp;type=atom"/>
	<updated>2012-01-19T09:53:54Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1199</id>
		<entry>
			<title type="html"><![CDATA[Odp: Błąd w procedurze, triggerze. Pilne.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3364#p3364"/>
			<content type="html"><![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).]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2012-01-19T09:53:54Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3364#p3364</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Błąd w procedurze, triggerze. Pilne.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3362#p3362"/>
			<content type="html"><![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 :(]]></content>
			<author>
				<name><![CDATA[lito77]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1340</uri>
			</author>
			<updated>2012-01-18T21:12:27Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3362#p3362</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Błąd w procedurze, triggerze. Pilne.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3361#p3361"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2012-01-18T18:38:56Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3361#p3361</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Błąd w procedurze, triggerze. Pilne.]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3360#p3360"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[lito77]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1340</uri>
			</author>
			<updated>2012-01-18T16:28:29Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3360#p3360</id>
		</entry>
</feed>
