<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1378&amp;type=atom"/>
	<updated>2012-10-12T23:19:30Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1378</id>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3753#p3753"/>
			<content type="html"><![CDATA[ad pola staz proponuje takie rozwiazanie
select
coalesce(nullif(coalesce('lat: '||nullif(trunc(staz),0)||' ','')||coalesce('mies.: '||nullif((staz-trunc(staz))*100,0)::int,''),''),'-') as staz2
from
(select 0.0::numeric(9,2) as staz union all
select 5::numeric(9,2) as staz union all
select 5.01::numeric(9,2) as staz union all
select 200.1::numeric(9,2) as staz union all
select 0.01::numeric(9,2) as staz union all
select null::numeric(9,2) as staz 
) d

ad formatowanie adresu wykorzystaj funkcje coalesce i to, że postgresql zwraca null jeśli złączysz ciąg z null-em powinno to wyglądać tak:
coalesce (adres_pełny, adres_bez_ulicy_z_ kodem,adres_bez_ulicy_i_kodu,'') as adres]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2012-10-12T23:19:30Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3753#p3753</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3751#p3751"/>
			<content type="html"><![CDATA[Ponieważ moje 'epokowe' ;) dzieło działa, to w wolnych chwilach zabrałem się za... no, optymalizacja to za dużo powiedziane... za upiększenie kodu.

Problem 1:
Mamy pole numeric(9,2) o nazwie "staz" 
Wartość w nim przechowywana zapisywana przed przecinkiem to lata (0-99), po przecinku to miesiące (0-11), np:
5,10 = 5 lat 10 miesięcy
2,00 = 2 lata
0,07 = 7 miesięcy
0,00 = wartość domyślna czyli użytkownik nic nie wpisał 

Chciałbym wyświetlać te wartości 'opisowo' i bez wiodących zer, np.:
5,10 = "lat: 5, mies.: 10"
2,00 = "lat: 2"
0,07 = "mies.: 7"
0,00 = "-"

Celowo z 'lat' i 'mies.' przed wartościami, bo jak się przymierzyłem do odpowiedniego odmieniania (1 rok, 2 lata, 10 lat, 1 miesiąc, 2 miesiące, 10 miesięcy etc.) to się przeraziłem ;)

Czy jest jakaś bardziej elegancka konstrukcja niż moje poniższe wypociny:
[code]
CASE
    WHEN    staz >= 1 AND MOD(staz,1) > 0
    THEN
        'lat: '
        || ltrim(split_part(to_char(staz::real,'00D00'), ',', 1), ' 0')
        ||
        ', mies.: '
        || ltrim(split_part(to_char(staz::real,'00D00'), ',', 2), ' 0')

    WHEN    staz >= 1 AND MOD(staz,1) = 0
    THEN
        'lat: '
        || ltrim(split_part(to_char(staz::real,'00D00'), ',', 1), ' 0')

    WHEN    staz > 0 AND staz < 1
    THEN
        'mies.: '
        || ltrim(split_part(to_char(staz::real,'00D00'), ',', 2), ' 0')

    ELSE
        '-'
END
[/code]
???
Ponieważ są 4 pola tego typu i podobnego przeznaczenia, to ten przydługawy fragment kodu występuje w zapytaniu czterokrotnie - mało fajnie wygląda (ale działa!), może dałoby się go skrócić...?


Problem 2:
Mamy tabelę z adresami.
W niej są między innymi pola adres_opisowy, kod_pocztowy, poczta, miejscowosc, ulica, nr_domu, nr_lokalu.
Pole adres_opisowy to złączone i odpowiednio sformatowane przez aplikację wartości pozostałych pól.
Pola ulica, nr_domu i nr_lokalu są typu character varying, o długości odpowiednio 65, 10 i 10.

Aplikacja zezwala (to jest efekt zamierzony i poprawny), aby użytkownik wypełnił tylko pola kod_pocztowy, poczta i miejscowosc. Wówczas adres opisowy przyjmuje wartość np. "Berdyczów, 99-999 Berdyczów".
Wyświetlanie takiego adresu jako adresu do kontaktu jest bezsensowne, więc chciałbym to warunkowo pominąć.

Ale...
Jak wiadomo, są miejscowości bez ulic. Więc użytkownik wprowadza pola kod_pocztowy, poczta, miejscowosc i numer_domu (+ew. numer lokalu).
Wówczas adres opisowy przyjmuje wartość "Berdyczów 25, 99-999 Berdyczów" i jest jak najbardziej wartościowym adresem do kontaktu.

Mój warunek wygląda tak:
[code]
CASE
    WHEN
        (SELECT SAD.ulica
            FROM adres SAD
            WHERE 
            SAD.id = PSO.id
            AND
            relacja = 'xxxxxx') IS NOT NULL
        OR
        (SELECT SAD.nr_domu
            FROM sy_adres SAD
            WHERE 
            SAD.id = PSO.id
            AND
            relacja = 'xxxxxx') IS NOT NULL
        OR
        (SELECT SAD.nr_lokalu
            FROM sy_adres SAD
            WHERE 
            SAD.id = PSO.id
            AND
            relacja = 'xxxxxx') IS NOT NULL

    THEN
        ...pierwszy raz wykonujemy na początku podzapytania, aby sprawdzić w połączeniu z innymi warunkami dotyczącymi innych tabel czy tworzyć nowy wiersz
        ...drugi raz wykonujemy w dalszej części podzapytania, aby wyświetlić adres

    ELSE
        ''
END
[/code]

Takich pól typu character varying związanych z adresem jest więcej: telefon, telefon komórkowy, fax, skrytka pocztowa (i chyba jeszcze coś...).
Aby obsłużyć je wszystkie,  to kod, na dodatek wywoływany dwukrotnie, zaczyna się monstrualnie rozrastać...
Da się to w jakoś bardziej 'zwarty' sposób napisać?

Uwaga: PostgreSQL 8.3, nie mogę wykonywać żadnych działań ingerujących w bazę danych i jej konfigurację!]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-10-10T21:26:16Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3751#p3751</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3743#p3743"/>
			<content type="html"><![CDATA[[quote=c_michal]Rozumiem, że generujesz z postgresql cały kod html strony, ile to się wykonuje?[/quote]
Tak - całość jest wykonywana poprzez 4 zapytania (z warunkami i podzapytaniami) i polecenie utworzenia tymczasowej sekwencji, zapisanych w jednym pliku wywoływanym przez psql -f "nazwa_pliku".
Kolega z innego urzędu dołożył jeszcze styl i skrypt pozwalający na wydruk, ale to są zupełnie odrębne, statyczne pliki.

Od czasu moich banalnych problemów ów plik 'trochę' się rozrósł (w obecnej wersji ma ~45KB i >1900 linii, acz ciągle znacząca ich liczba to efekt wielu komentarzy i formatowania służącego czytelności kodu), ale dla około 40 pozycji wykonuje się w czasie około 0,2 sekundy - na dość dobrej maszynie serwerowej, bo ostatecznie przerzuciłem to na SLES 11 i 'ożeniłem' z cronem.

Jakby coś, to ten plik mogę przesłać - jego powstanie i wykorzystanie to w całości działalność [i]pro publico bono[/i].

[quote=c_michal]A tak z ciekawości zapytam jaką masz wersję postgresa, że na górze piszesz cytuje "Z uwagi (...) 

Nie pamiętam dokładnie ale chyba wystarczy na czas wykonywanie tego skryptu zmienić kodowanie o ile pamiętam robi się to tak (musisz sobie zaeksperymentować):
SET CLIENT_ENCODING TO 'UTF8'; , powrót do ustawień pierwotnych to RESET CLIENT_ENCODING;[/quote]

Chętnie bym poeksperymentował, ale nie mam pewności, czy proponowana przez Ciebie modyfikacja nie wpłynie na efekty działania pozostałych użytkowników, bo baza jest elementem aplikacji, która działa produkcyjnie non-stop.
Boję się po prostu cokolwiek zmieniać i grzebać w konfiguracji, ponieważ - jak wspomniałem wcześniej - samowolne działania w tym zakresie prowadzą do utraty gwarancji i wsparcia producenta aplikacji.

Jeszcze przed przerzuceniem tego na SLESa napisałem post w wątku 
[url]http://forum.postgresql.org.pl/viewtopic.php?id=175[/url]

Myślałem, że po 'przeprowadzce' na Linuxa zmieni się kodowanie klienta (sądziłem, że 'klientem' będzie maszyna serwerowa z jej stroną kodową), ale w wyniku wykonania na konsoli serwera poleceń podpowiedzianych innemu użytkownikowi przez [b]gszpetkowski[/b] w dalszym ciągu otrzymuję:
psql -l = UTF-8
server_encoding = UTF-8
client_encoding = WIN1250

Tak więc rozwiązanie tej sprawy najchętniej widziałbym jako jakiś parametr dodany do wywołania psql, konwertujący 'w locie' dane zapisywane do wynikowego pliku html. Niestety niczego na taki temat w dokumentacji się nie doczytałem.
Jeśli tego nie da się zrobić w taki sposób, to raczej zostanie tak jak jest...
Muszę też jeszcze koniecznie dodać, że z Linuxa jako takiego też jestem na poziomie użytkownika... hmm... niezaawansowanego ;), więc całkiem możliwe, że przekodować plik dałoby się za pomocą jakichś narzędzi systemowych. Na tym polu mam jednak jeszcze dużo lektury przed sobą.

Polecenie obecnie wygląda tak:
[code]psql -h localhost -f oferty.sql -t _baza_ _user_ > Ofertypracy.htm[/code]]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-10-05T10:46:08Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3743#p3743</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3742#p3742"/>
			<content type="html"><![CDATA[Fajnie działa. Rozumiem, że generujesz z postgresql cały kod html strony, ile to się wykonuje?

A tak z ciekawości zapytam jaką masz wersję postgresa, że na górze piszesz cytuje "Z uwagi na ograniczenia wynikające z wykorzystywanej bazy danych strona kodowana jest w standardzie Windows-1250. Przepraszamy.".

Nie pamiętam dokładnie ale chyba wystarczy na czas wykonywanie tego skryptu zmienić kodowanie o ile pamiętam robi się to tak (musisz sobie zaeksperymentować):
SET CLIENT_ENCODING TO 'UTF8'; , powrót do ustawień pierwotnych to RESET CLIENT_ENCODING;]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2012-10-04T19:57:02Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3742#p3742</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3741#p3741"/>
			<content type="html"><![CDATA[Tak to wygląda i działa 'na żywo i w kolorze':

[url]http://www.pupkwidzyn.pl/oferty/Ofertypracy.htm[/url]]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-10-04T11:51:16Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3741#p3741</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3716#p3716"/>
			<content type="html"><![CDATA[Dziękuję [b]c_michal[/b] - bez Twojej pomocy stałbym w miejscu!
Albo w najlepszym przypadku wyważał otwarte drzwi...

Wersja 'dla wątpiących' działa doskonale.

Za to wersja z array_agg 'produkuje' jakieś dziwne wyniki.
Ale to chyba z mojej winy, bo nie dość szczegółowo rozpisałem cały problem.
Ta moja procedurka jest dość skomplikowana (jak dla mnie ;) ) i pewnie ominąłem coś ważnego, rzutującego na efekt. 
Ma >26KB, prawie 1000 linii (fakt, że ponad połowa z nich to komentarze, odstępy i sztucznie separowane wyrażenia), kilka poleceń, jedno duuuże zapytanie, kilka podzapytań i kilkanaście wyrażeń warunkowych (czasem także z podzapytaniami).

Nic to - pozostały mi tylko kosmetyczne poprawki.

Jeśli będzie zainteresowanie, to mogę po uruchomieniu (przyszły tydzień?) podrzucić link do efektów jej działania.]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-09-19T14:06:58Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3716#p3716</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3703#p3703"/>
			<content type="html"><![CDATA[Dziękuję za pochylenie się nad moim problemem :)

[quote=c_michal]twoje zapytanie powinno wyglądać tak (...)[/quote]
Mam z rana inne zajęcie, ale jeszcze dziś powalczę i dam znać o efektach!

[quote=c_michal]O ile sprawdziłeś, że funkcja array_agg działa na 8.3 choć z dokumentacji wynika, że nie[/quote]
To prawda, że array_agg() jako takiej nie ma w PostgreSQL 8.3, jednak funkcja ta została dodana przez wdrożeniowca 'z palca' podczas uruchamiania całego systemu (polecenia wpisywane na konsoli wg 'przepisu', który chyba widziałem zresztą gdzieś na forum).
Mimo to postaram się zaadoptować wersję z array(), czyli dla funkcji oryginalnej w tej wersji Postgresa.

[quote=c_michal]dołączaj skrypty z danymi i tabelami tak jak poniżej to bardzo ułatwia napisanie odpowiedzi[/quote]
Postaram się następnym razem!
Na usprawiedliwienie mam to, że problem wydawał mi się tak banalny, że doświadczonym użytkownikom nie sprawi kłopotu rozwiązanie go 'na sucho'.
No i to, że możliwości modyfikacji w bazie (CREATE, DROP, ALTER, UPDATE, DELETE) mam bardzo ograniczone, by nie rzec - zerowe... Więc to co spłodzę, to będzie wersja taka bardziej 'teoretyczna'.]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-09-18T07:12:35Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3703#p3703</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3701#p3701"/>
			<content type="html"><![CDATA[nie trać wiary twoje zapytanie powinno wyglądać tak (znaczki html dodasz sobie sam):

select s.stanowisko,s.firma,array_to_string(array_agg(w.rodzaj||' / '||w.opis||' / '||w.waga),',')
from stanowiska s
left join wymagania w on w.id_stanowiska=s.id_stanowiska
group by s.stanowisko,s.firma

O ile sprawdziłeś, że funkcja array_agg działa na 8.3 choć z dokumentacji wynika, że nie dlatego dołączam wersję dla WĄTPIĄCYCH

select s.stanowisko,s.firma
,array_to_string(array(select w.rodzaj||' / '||w.opis||' / '||w.waga from wymagania w where w.id_stanowiska=s.id_stanowiska),',')
from stanowiska s
 


PS
Wielka prośba jak prosisz o pomoc to dołączaj skrypty z danymi i tabelami tak jak poniżej to bardzo ułatwia napisanie odpowiedzi np.
CREATE TABLE stanowiska
(
   id_stanowiska serial primary key
  ,stanowisko varchar(255) NOT NULL
  ,firma varchar(255) 
)
WITH (OIDS=FALSE);

INSERT INTO stanowiska(id_stanowiska, stanowisko, firma) VALUES 
 (1, 'Kierowca', 'TRANSPORT SAMOCHODOWY')
,(2, 'Kelner', 'GRASTRONOMIA U ZENKA')
,(3, 'Polityk', 'Sejm');
CREATE TABLE wymagania
(
   id_wymagania serial primary key
  ,id_stanowiska integer not null
  ,rodzaj varchar(255)
  ,opis varchar(255)
  ,waga varchar(255)
)
WITH (OIDS=FALSE);
INSERT INTO wymagania(id_wymagania, id_stanowiska, rodzaj, opis, waga) VALUES 
 (1, 1, 'prawo jazdy', 'kat. C', 'konieczne')
,(2, 1, 'prawo jazdy', 'kat. C+E', 'pożądane')
,(3, 1, 'badania', 'psychotesty', 'konieczne')
,(4, 2, 'język obcy', 'angielski', 'pożądane')
,(5, 2, 'badania', 'minimum sanitarne', 'konieczne');]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2012-09-17T20:22:49Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3701#p3701</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3700#p3700"/>
			<content type="html"><![CDATA[Witam ponownie,

Męczę to swoje zapytanie 'produkujące' plik html i natrafiłem na kolejny, ostatni już problem.
Co najgorsze mam wrażenie, że na forum już widziałem podobny problem i jego rozwiązanie, tylko teraz (od trzech dni!!!) nie mogę tego znaleźć :/

Do rzeczy:

Tabela 1 - Stanowiska:
[code]
id_stanowiska, stanowisko, firma
1, Kierowca, TRANSPORT SAMOCHODOWY
2, Kelner, GRASTRONOMIA U ZENKA
[/code]

Tabela 2 - Wymagania:
[code]
id_wymagania, id_stanowiska, rodzaj, opis, waga
1, 1, prawo jazdy, kat. C, konieczne
2, 1, prawo jazdy, kat. C+E, pożądane
3, 1, badania, psychotesty, konieczne
4, 2, język obcy, angielski, pożądane
5, 2, badania, minimum sanitarne, konieczne
[/code]

Stanowisko jest zawsze.
Wymagań może nie być wcale, może być jedno, może być wiele.
Wymagania mogą być przypisane tylko do konkretnego stanowiska.

Usiłuję sklecić zapytanie, które zwróci w jednej kolumnie wiersze zawierające zarówno rekordy z tabeli Stanowiska, jak i Wymagania, np.:
[code]
...
Kierowca
Firma: TRANSPORT SAMOCHODOWY
prawo jazdy / kat. C / konieczne
prawo jazdy / kat. C+E / pożądane
badania / psychotesty / konieczne
...
Kelner
Firma: GRASTRONOMIA U ZENKA
język obcy / angielski / pożądane
badania / minimum sanitarne / konieczne
...
[/code]

W miejscu '...' są statyczne teksty związane z html wstawiane przeze mnie (w rodzaju <table>, <td>, </tr> etc. - z tym nie ma problemu). W miejscu '/' są znaczniki kolumn tabeli html.

Taki plik html wyglądać powinien - bez zbędnych upiększeń - tak jak niżej (zaznaczam, że z wstawianiem tagów html do wyników zapytania nie mam żadnych problemów!):

[code]
<table>
<tr><td colspan=3>Kierowca</td>
<tr><td>Firma:</td><td>TRANSPORT SAMOCHODOWY</td><td></td></tr>
<tr><td>prawo jazdy</td><td>kat. C</td><td>konieczne</td></tr>
<tr><td>prawo jazdy</td><td>kat. C+E</td><td>pożądane</td></tr>
<tr><td>badania</td><td>psychotesty</td><td>konieczne</td></tr>
</table>
<br><br>
<table>
<tr><td colspan=3>Kelner</td>
<tr><td>Firma:</td><td>GRASTRONOMIA U ZENKA</td><td></td></tr>
<tr><td>język obcy</td><td>angielski</td><td>pożądane</td></tr>
<tr><td>badania</td><td>minimum sanitarne</td><td>konieczne</td></tr>
</table>
[/code]

Próbowałem użyć kombinacji
[code]
SELECT stanowisko, firma,
     (SELECT array_to_string(array_agg(...html...||rodzaj||...html...||opis||...html...||waga))
     FROM Wymagania
     WHERE
     Stanowiska.id_stanowiska = Wymagania.id_stanowiska)

FROM Stanowiska, Wymagania
WHERE jakieś warunki...
[/code]

ale w wyniku dostaję błąd: [b]more than one row returned by subquery used as an expression[/b]


Ograniczenia:
- zapytanie ma się wykonywać automatycznie z wykorzystaniem systemowego harmonogramu zadań, więc nie wchodzą w grę ręczne manipulacje wynikiem
- nie mogę nic grzebać w konfiguracji i strukturze bazy, bo stracę licencję na aplikację (więc pewnie i stosowanie funkcji odpada - nawet jeśli miałbym o nich szersze pojęcie...), jedyna dopuszczalna opcja to wykonywanie zapytań
- wersja: PostgreSQL 8.3 na WindowsXP


Jeśli nikt nie pomoże, to stracę wiarę w potęgę SQL ;)]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-09-17T13:29:23Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3700#p3700</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3698#p3698"/>
			<content type="html"><![CDATA[Dziękuję c_michal za zainteresowanie.

Po Twojej odpowiedzi widzę, że chyba niedostatecznie jasno opisałem swój problem (a wczoraj opis wydawał mi się jasny i przejrzysty ;)).

Rzecz polega na tym, że plik html ma być tworzony cyklicznie i automatycznie poprzez zadanie wywoływane za pomocą systemowego Harmonogramu.
Podane w moim poście wyrażenia 'tekst1'--'tekst5' są wartościami stałymi: to linie zawierające wyrażenia typu '<head>', '<title>', '<meta ...>' itp.
Właśnie w znacznikach meta mają być wkomponowane informacje o godzinie aktualizacji i użytkowniku - to nie problem.

Więc sposób 1. odpada, podobnie jak sposób 2 - ze względu na konieczność manualnych kombinacji.

Ale sposób 3. to jest to - zapomniałem na śmierć o operatorze złączenia || :/
Tak to jest, jak coś robi się raz na ruski rok...
A dodając za każdą linią 'stałego' tekstu złączenie z wartością chr(10) i innych znaków sterujących wychodzi nawet elegancko sformatowany źródłowy plik html :)

Dziękuję!]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-09-13T06:24:37Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3698#p3698</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3697#p3697"/>
			<content type="html"><![CDATA[Są co najmniej trzy sposoby:
1 z PgAdmina zrób szybki raport - plik->Szybki raport... i wyeksportuj do xhtml-a i dalej obrób plik w edytorze

2 Utworz sobie do bazy źródło danych ODBC (wymagany sterownik) i załaduj dane do Excel-a menu Dane->Importuj dane zewnętrzne->Nowa kwerenda bazy danych... następnie zapisz plik jako html 

3 Jeśli zależy ci tylko by zapisać dane do tabeli html-a wykonaj swój select analogicznie jak poniższy, najlepiej z PgAdmina następnie wyeksportuj go bez nagłówków i znaków cudzysłowia do pliku tekstowego

select table_txt from (
select '<table>'
|| '<tr>'||'<td>'||'naglowek tabela'||'</td>'
||'<td>'||'naglowek schemat'||'</td>'||'</tr>' as table_txt,1 as kolejnosc
,'' as kol_1,'' as kol_2
union all
SELECT 
 '<tr>'||'<td>'||tablename||'</td>'
||'<td>'||tableowner||'</td>'||'</tr>' as table_txt,2 as kolejnosc
,tablename as kol_1,tableowner as kol_2
FROM pg_tables
union all
select '</table>' as table_txt,3 as kolejnosc
,'' as kol_1,'' as kol_2
) d
order by kolejnosc ,kol_2,kol_1]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2012-09-12T20:18:09Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3697#p3697</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[psql i zmiana separatora pól w pliku wynikowym [+ostatni problem]]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3696#p3696"/>
			<content type="html"><![CDATA[PostgreSQL 8.3 na WindowsXP:

Muszę wyciągnąć pewne dane z bazy i wrzucić je do pliku html.
Html jak to html - powinien mieć nagłówek.
Cała reszta poza nagłówkiem raczej nie sprawi problemu (chyba ;))

Ten nagłówek 'robię' zwykłym selectem:
select 'tekst1', 'tekst2',''tekst3'+pole_z_bazy+'tekst4' ,'tekst5' from tabela where id=1

Polecenie zapisane jest w pliku plik.sql, a wywoływane:
psql.exe -h host -f plik.sql -t -F "jakiś_separator" baza user > "plik.html"

Parametr -F według dokumentacji odpowiada za zmianę znaku separatora pól, defaultowo jest znak "|".
Jednak czegokolwiek tam nie wpiszę, to zawsze w wyniku dostaję tekst przedzielony owym "|".
Oczywiście strona w przeglądarce jest wówczas tymi znakami upstrzona...
Co robię źle?
Co wpisać jako wartość -F, aby dostać znak końca wiersza? Albo przynajmniej spację?]]></content>
			<author>
				<name><![CDATA[grzechu]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=963</uri>
			</author>
			<updated>2012-09-12T13:44:57Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3696#p3696</id>
		</entry>
</feed>
