<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Problem z kursorek]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1847&amp;type=atom"/>
	<updated>2013-06-01T11:22:11Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1847</id>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z kursorek]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4560#p4560"/>
			<content type="html"><![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 ;)]]></content>
			<author>
				<name><![CDATA[Natka16k]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1588</uri>
			</author>
			<updated>2013-06-01T11:22:11Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4560#p4560</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z kursorek]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4559#p4559"/>
			<content type="html"><![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;]]></content>
			<author>
				<name><![CDATA[depesz]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1564</uri>
			</author>
			<updated>2013-06-01T10:06:24Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4559#p4559</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Problem z kursorek]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4558#p4558"/>
			<content type="html"><![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 ;)]]></content>
			<author>
				<name><![CDATA[Natka16k]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1588</uri>
			</author>
			<updated>2013-05-31T22:37:15Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4558#p4558</id>
		</entry>
</feed>
