<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - błąd składni]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1932&amp;type=atom"/>
	<updated>2014-01-20T14:27:58Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1932</id>
		<entry>
			<title type="html"><![CDATA[Odp: błąd składni]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4984#p4984"/>
			<content type="html"><![CDATA[ok , dzięki za pomoc. Mi chodziło głównie o to że mi nie kompilowało a nie sprawdziłem dokładnie składni IF . Jednak nauka i zbyt wielu języków jednocześnie może być zgubna, a tego typu literówki lub błędy składniowe najgorzej zauważyć.
I dzięki za link, rzeczywiście łączenie tabel wydaję się lepsze na pierwszy rzut oka :)]]></content>
			<author>
				<name><![CDATA[mattd]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1706</uri>
			</author>
			<updated>2014-01-20T14:27:58Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4984#p4984</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: błąd składni]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4980#p4980"/>
			<content type="html"><![CDATA[[quote=depesz]W twoim przypadku wydaje mi się (sorry, na testowanie za wcześniej), że problemem jest użycie "create table".[/quote]

to nie do końca prawda co pisze depesz poniżej skrypt, który wykonuje create function wewnątrz funkcji na postgresql 9.3.2. 

Rozwiązanie, które proponuje mattd [b]jest z gruntu złe[/b] ale można oczywiście i tak tylko poco mattd poczytaj posta na [url=http://forum.postgresql.org.pl/viewtopic.php?id=1921]Forum PostgreSQL[/url] zwłaszcza, że dotyczy dokładnie twojego problemu (następnym razem czytaj posty).

drop table if exists rok2004;
create table rok2004 as select miesiac,2004,trunc(random()*12)::int as wynik from generate_series(1,12) as d(miesiac);
drop table if exists rok2005;
create table rok2005 as select miesiac,2005,trunc(random()*12)::int as wynik from generate_series(1,12) as d(miesiac);
CREATE OR REPLACE FUNCTION rap() RETURNS void
LANGUAGE 'plpgsql' AS $$
declare
    r4 decimal(10,2);
    r5 decimal(10,2);
BEGIN
    Create table if not exists raport(
    miesiac int not null,
    rok int,
    wynik decimal(10,2),
    PRIMARY KEY (miesiac)
    );
    delete from raport;
        for i IN 1 .. 12 LOOP
            Select into r4 wynik  from rok2004 where miesiac=i;
            Select into r5 wynik from rok2005 where miesiac=i;
            if (r4>r5) then
                Insert into raport (miesiac,rok,wynik)
                VALUES(i,2004,r4);
            elsif (r4<r5) then
                Insert into raport (miesiac,rok,wynik)
                VALUES(i,2005,r5);
            else
                Insert into raport (miesiac,rok,wynik)
                VALUES(i,20042005,r4);
            END IF;
        END LOOP;
END;
$$;

select rap();
select * from raport;]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2014-01-18T20:09:40Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4980#p4980</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: błąd składni]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4979#p4979"/>
			<content type="html"><![CDATA[Najprostsza metoda debugowania: usuwaj kod dopóki nie usuniesz błędu. W twoim przypadku wydaje mi się (sorry, na testowanie za wcześniej), że problemem jest użycie "create table". O ile pamiętam nie można używać ddl'i wewnątrz funkcji, chyba, że użyjesz dynamicznych zapytań (execute 'create ...';)]]></content>
			<author>
				<name><![CDATA[depesz]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1564</uri>
			</author>
			<updated>2014-01-17T10:45:09Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4979#p4979</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[błąd składni]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4977#p4977"/>
			<content type="html"><![CDATA[Witam, pisze funkcje która odczytuje dane z dwóch tabel o takich samych nazwach atrybutów i wstawiam do 3 tabeli w formacie (miesiac, rok , wynik) . Napisałem tak jakby się logicznie wydawało że powinno działać ale pgAdmin wyrzuca mi błąd składni przy END LOOP; . Siedzę już chwile nad tym problemem i nic nie mogę wymyślić wiec może by ktoś rzucił okiem na kod

CREATE OR REPLACE FUNCTION rap() RETURNS void 
LANGUAGE 'plpgsql' AS $$
declare 
	r4 decimal(10,2);
	r5 decimal(10,2);
BEGIN
	Create table if not exists raport(
	miesiac int not null,
	rok int,
	wynik decimal(10,2),
	PRIMARY KEY (miesiac)
	);
		for i IN 1 .. 12 LOOP
			Select wynik from rok2004 where miesiac=i into r4;
			Select wynik from rok2005 where miesiac=i into r5;
			if (r4>r5) then
				Insert into raport (miesiac,rok,wynik)
				VALUES(i,2004,r4);
			else if (r4<r5) then
				Insert into raport (miesiac,rok,wynik)
				VALUES(i,2005,r5);
			else 
				Insert into raport (miesiac,rok,wynik)
				VALUES(i,20042005,r4);
			END IF;
		END LOOP;
END;
$$;]]></content>
			<author>
				<name><![CDATA[mattd]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1706</uri>
			</author>
			<updated>2014-01-16T14:09:11Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4977#p4977</id>
		</entry>
</feed>
