<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Problem z kursorek]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1847</link>
		<description><![CDATA[Najświeższe odpowiedzi w Problem z kursorek.]]></description>
		<lastBuildDate>Sat, 01 Jun 2013 11:22:11 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Problem z kursorek]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4560#p4560</link>
			<description><![CDATA[Dzięki za pomoc ;) Masz rację - to moja "zaleciałość" z MSSQL - po prostu dostałam kawałek kodu w MSSQL i miałam go przerobić na PostgreSQL, więc się trochę pogubiłam... I jeszcze raz wielkie dzięki ;)]]></description>
			<author><![CDATA[dummy@example.com (Natka16k)]]></author>
			<pubDate>Sat, 01 Jun 2013 11:22:11 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4560#p4560</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z kursorek]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4559#p4559</link>
			<description><![CDATA[Używanie kursorów w funkcjach jest bardzo typowym przykładem czegoś co "przynoszą" ze sobą ludzie z innych baz, a co w postgresie jest całkowicie niepotrzebne, wręcz czasem szkodliwe.

W szczególności, twoją funkcję można uprościć do postaci pojedynczego zapytania:

select sum(czas_przyjazd - czas_wyjazd) from kurs where data_kurs between $2 and $3 and id_motorniczy = $1;

I to wszystko. Robienie ręcznej iteracji po rekordach, zwłaszcza - wszystkich rekordach, by ręcznie nałożyć warunki z IF'a jest całkowicie nieuzasadnialne - jedyne co uzyskasz to znaczne spowolnienie.

Do iterowania po recordsetach użyj normalnej pętli:

declare
    temprec record;
begin
    for temprec in select * from kurs loop
        if temprec.id_motorniczy = ....
        ...
    end loop;
    ...
end;]]></description>
			<author><![CDATA[dummy@example.com (depesz)]]></author>
			<pubDate>Sat, 01 Jun 2013 10:06:24 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4559#p4559</guid>
		</item>
		<item>
			<title><![CDATA[Problem z kursorek]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4558#p4558</link>
			<description><![CDATA[Witam,

mam dość kłopotliwy i zapewne łatwy do rozwiązania błąd, który od kilku dni spędza mi sen z powiek. Mam taki oto kod:

CREATE FUNCTION czas_pracy (integer,date,date)
RETURNS time
AS $$
	DECLARE 
		id ALIAS FOR $1;
		od ALIAS FOR $2;
		do ALIAS FOR $3;
		razem time:='00:00'; 
		id_motor integer; 
		data_k date; 
		cz_wyj time; 
		cz_przyj time;
	
	BEGIN
	--BEGIN TRANSACTION;
	DECLARE cz_pr CURSOR
		FOR SELECT id_motorniczy, data_kurs, czas_wyjazd, czas_przyjazd FROM kurs;

	--OPEN cz_pr;
	FETCH 1 FROM cz_pr INTO id_motor, data_k, cz_wyj, cz_przyj;

	WHILE FOUND LOOP
		IF id_motor=id AND data_k BETWEEN od AND do AND cz_przyj IS NOT NULL
		THEN
			razem:=razem + (cz_przyj - cz_wyj);
		END IF;

		FETCH 1 FROM cz_pr INTO id_motor, data_k, cz_wyj, cz_przyj;
	END LOOP;

	CLOSE cz_pr;
	--COMMIT TRANSACTION;

	RETURN razem;
	END;
$$ LANGUAGE 'PLPGSQL';

i nie mam zielonego pojęcia czemu nie działa, więc mam taką małą prośbę - moglibyście na to zerknąć i pomóc mi rozwiązać ten problem? 
Z góry dzięki za poświęcenie czasu ;)]]></description>
			<author><![CDATA[dummy@example.com (Natka16k)]]></author>
			<pubDate>Fri, 31 May 2013 22:37:15 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4558#p4558</guid>
		</item>
	</channel>
</rss>
