<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=276&amp;type=atom"/>
	<updated>2009-08-27T22:13:56Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=276</id>
		<entry>
			<title type="html"><![CDATA[Odp: Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1198#p1198"/>
			<content type="html"><![CDATA[[quote=rski]Wywołac możesz na przykład tak (...)[/quote]
Takie to proste?! ;) Żartuję...
Dzięki za podpowiedź - będę kombinował.
Jeśli napotkam jakieś dodatkowe problemy z tym zagadnieniem, to pozwolę sobie jeszcze pozawracać głowę.

[quote=rski]Masz wsparcie dla postgresa?[/quote]
Niestety nie.
Tylko do aplikacji napisanej głownie w Javie, operującej na bazie postrgresowej.
Na dodatek umowy z producentem podpisywało ministerstwo i wszelkie procedury i warunki są dość sztywne i sformalizowane.
Lepiej więc nie kusić losu, bo skutki (finansowe) mogą być opłakane.]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2009-08-27T22:13:56Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1198#p1198</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1194#p1194"/>
			<content type="html"><![CDATA[Wywołac możesz na przykład tak (chociaż sposób wywołania zależy do tego definicji funkcji, od typu przez nią zwracanego).
[code]
psql -c 'select nazwa_funkcji()' nazwa_bazy> wynik.txt
[/code]

W samej funkcji komunikaty możesz wywalać poleceniem RAISE INFO, lub RAISE NOTICE (nie wiem jaki masz poziom logowania ustawiony), ale jedno z tych poleceń powinno działać.

[code]
Do bazy nie mogę (to znaczy mogę, ale nie będę tego robił, bo utracę wsparcie producenta aplikacji) nic doinstalowywać
[/code]
Masz wsparcie dla postgresa?]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-08-27T07:28:08Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1194#p1194</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1193#p1193"/>
			<content type="html"><![CDATA[Dziękuję za zainteresowanie!
Pokrótce, aby nie zajmować cennego czasu: o perlu pojęcie mam tylko takie, że jest... Do bazy nie mogę (to znaczy mogę, ale nie będę tego robił, bo utracę wsparcie producenta aplikacji) nic doinstalowywać ani zmieniać jej struktury.

Będę zobowiązany za wskazanie w jaki sposób przekierować wyjście do pliku w plpgsql.
Gdy będę miał już wyniki w pliku na dysku, to nie będzie dla mnie żadnym problemem go przeformatować do ostatecznej postaci.]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2009-08-27T05:46:55Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1193#p1193</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1191#p1191"/>
			<content type="html"><![CDATA[No to chyba jakiś proceduralny język niezaufany (np plperlu) by sie przydał. Było by najprościej. No chyba że nie możesz zainstalować czegoś takiego wtedy można też zwykłym plpgsql ale trza przekierowywac komunikaty do pliku i jeszcze ten plik potem trochę obrobić. Nie wiem czy coś skumałeś :) bo mam mało czasu. Możesz coś doinstalować do bazy?]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-08-26T14:44:38Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1191#p1191</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1183#p1183"/>
			<content type="html"><![CDATA[[quote=rski]Masz na myśli procedurę składową? W jakim języku?[/quote]
Pewnie właśnie o coś takiego chodzi - o kod przypisany do samodzielnie zdefiniowanej w aplikacji akcji, która w efekcie da plik html z oczekiwanymi wynikami.
W jakim języku? Nooo... w PostgreSQL...? (Ależ się czuję malutki...)

Żeby nie było, że siedzę z założonymi rękoma, to porozglądałem się w funkcjach wbudowanych w bazę przez programistów aplikacji.
Znalazłem konstrukcję, która wygląda obiecująco (bo znajomo...):

FOR zmienna IN SELECT kolumna/y FROM tablica WHERE warunek
    LOOP
        (...tutaj wykonują się warunkowo polecenia w stylu wynik := wynik || kolumna)
    END LOOP
END

Czy to dobra droga? I jak 'wynik' zapisać do pliku?

Zrobiłem też proste zapytania, które w gridzie pgAdmin3 bezproblemowo pokazują poprawne wyniki.
Czyli dadzą się też ręcznie zapisać i ewentualnie sparsować jakimś samodzielnie naskrobanym zewnętrzym programikiem...
Ale to rzeźbienie i manufaktura w porównaniu do możliwej do zastosowania i pożądanej opcji 'wskaż nazwę akcji i naciśnij przycisk Wykonaj'.]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2009-08-24T13:41:58Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1183#p1183</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1180#p1180"/>
			<content type="html"><![CDATA[Masz na myśli procedurę składową? W jakim języku?]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-08-24T09:12:31Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1180#p1180</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Sekwencyjne przetwarzanie rekordów i wyjście do pliku]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=1178#p1178"/>
			<content type="html"><![CDATA[Czołem,
W firmie zmieniamy właśnie platformę bazy danych i aplikację ją obsługującą - z Progress 7.3 na PostgreSQL 8.3.
W związku z tym zachodzi oczywiście konieczność przepisania (a właściwie napisania od nowa) wszystkich procedur i raportów wyciągających niestandardowo - to znaczy poza wbudowanymi raportami i formatami - dane z bazy.
Z większością drobiazgów już sobie poradziłem, ale szczególnie z jednym przypadkiem mam kłopot...
Poniżej adres, pod którym można obejrzeć wyniki działania dotychczas stosowanej procedury:
[url]http://www.pupkwidzyn.pl/oferty/Ofertypracy.htm[/url] (wyłącznie czysty html, bez żadnych skryptów)
a niżej procedura w Progress 4GL, która powyższego html'a generuje:
[url]http://www.pupkwidzyn.pl/oferty/OFERTY1.ZIP[/url]
(w archiwum jest spakowany do ~5kb plik tekstowy *.p z procedurą Progress'a)

W skrócie ta procedura działa tak:

FOR EACH oferta WHERE spełniony_warunek
	FIND FIRST słownik WHERE id.oferta = id.słownik
	OUTPUT TO plik_na_dysku
		Dane_z_oferta i elementy formatujące
		Dane_z_słownik i elementy formatujące
(...i szukamy w pętli następnej oferty spełniającej warunek...)
END

Jak widać przeglądana jest sekwencyjnie tablica z ofertami, jeśli jakiś rekord spełnia warunek, to wyszukiwane są dane słownikowe dla niego, potem poszczególne pola z tabli po dodaniu elementów formatujących html zapisywane są w pliku.
Czas wykonania nie jest istotny - przeglądana tablica z ofertami ma ok. 10000 rekordów, na słownikach jest indeks domyślny, całość wykonuje się w kilka sekund.
Na początku i w międzyczasie tworzony jest też nagłówek strony oraz nawigacja na niej, ale to na razie jest nieistotne.
Struktura nowej bazy w PostgreSQL, acz nieco inna od poprzedniej Progressowej, nie jest problemem - z istniejących relacji da się wyciągnąć interesujące mnie rzeczy.

Nie pytam, czy coś takiego jest wykonalne w PostgreSQL, bo zapewne jest :)
Chciałbym tylko prosić - jeśli można - o naszkicowanie szkieletu procedurki z podaniem komend/poleceń (mile widziany jakiś przykład, na podstawie którego można by zbudować coś analogicznego), lub pokierowanie w odpowiednie miejsce w dokumentacji, w którym mógłbym coś na ten temat znaleźć - to co dotychczas przeczytałem i wyszukałem na forum niestety nie przybliżyło mnie do rozwiązania...
Pewnie dlatego, że to moje prawie zupełnie pierwsze kroki w PostgreSQL i jeszcze nie potrafię nawet z dokumentacji i przykładów korzystać :( Nie mówiąc o zrozumieniu 'filozofii' SQL jako takiego...

Szczególną zagadką dla mnie jest:
- jak przetwarzać sekwencyjnie pojedyńczy wiersz z wielu otrzymanych w wyniku zapytania, na dodatek łączący się z wynikami z innych tablic?
- jak wstawić elementy formatujące?
- jak w ogóle przekierować wyjście obrabianych w ten sposób pól i elementów do pliku?

Z narzędzi PostgreSQL do dyspozycji mam: pgAdmin3, możliwość podpięcia się z php oraz wbudowaną w aplikację możliwość uruchamiania własnych zapytań/procedur w trybie do odczytu - jest najzupełniej obojętne, jakiego narzędzia użyję...

Za wszelkie podpowiedzi będę wdzięczny

Pozdrawiam
Grzechu]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2009-08-24T08:27:34Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=1178#p1178</id>
		</entry>
</feed>
