<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Dynamiczny SQL]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=637</link>
		<description><![CDATA[Najświeższe odpowiedzi w Dynamiczny SQL.]]></description>
		<lastBuildDate>Sun, 11 Sep 2011 08:26:32 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Dynamiczny SQL]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2708#p2708</link>
			<description><![CDATA[super, bardzo dziękuję za tą odpowiedź, na pewno się zapoznam z nią oraz z podaną książką :)]]></description>
			<author><![CDATA[dummy@example.com (filip11)]]></author>
			<pubDate>Sun, 11 Sep 2011 08:26:32 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2708#p2708</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Dynamiczny SQL]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2707#p2707</link>
			<description><![CDATA[Witaj na forum. Mnie dynamiczny SQL kojarzy się z funkcjami składowanymi pisanymi w PL/pgSQL, a w szczególności z poleceniem [url=http://www.postgresql.org/docs/8.4/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN]EXECUTE[/url], które pozwala dowolnie "złożyć" SQL'a jako ciąg znaków, a następnie go wykonać w ramach tej funkcji.

Przykładem mogłaby być funkcja, która na wejściu otrzymuje ilość n kolumn, a jej działanie polega na utworzeniu nowej tabeli zawierającej n losowo wygenerowanych kolumn:

[code]CREATE OR REPLACE FUNCTION dynamicCreate(int) RETURNS void
AS $BODY$
DECLARE
    _sql text;
    _columnName text;
    i integer;
BEGIN
    DROP TABLE IF EXISTS dynamicTable;
    _sql := 'Create Table dynamicTable (';
    FOR i IN 1..$1 LOOP
        SELECT INTO _columnName array_to_string(ARRAY(SELECT chr((97 + round(random() * 25))::integer) FROM generate_series(1,5)), '');
        _sql := _sql || _columnName || ' text';
        IF i <> $1 THEN
            _sql := _sql || ',';
        END IF;
    END LOOP;
    _sql := _sql || ')';
    RAISE NOTICE '%', _sql;
    EXECUTE _sql;
    RETURN;
END;
$BODY$ LANGUAGE plpgsql;[/code]

Wywołanie:

[code]Select dynamicCreate(10);
\d dynamicTable
Table "public.dynamictable"
 Column | Type | Modifiers
--------+------+-----------
 bddip  | text |
 dygin  | text |
 wnios  | text |
 qcvwq  | text |
 plwdi  | text |
 ioxut  | text |
 bysqa  | text |
 iprfp  | text |
 ywjqq  | text |
 hrubg  | text |[/code]

Generalnie polecałbym zapoznanie się z dokumentacją Postgres'a (link zawarłem powyżej), mógłbyś także przejrzeć książkę "Beginning Databases with PostgreSQL: From Novice to Professional" np. na Google Books, na stronie 297 znajdziesz dosyć krótki podpunkt "Dynamic Queries" m.in piszą o EXECUTE:

[quote]The string for query can be dynamically created within a stored procedure, using the string-manipulation operator we met earlier[/quote]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Sat, 10 Sep 2011 12:56:51 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2707#p2707</guid>
		</item>
		<item>
			<title><![CDATA[Dynamiczny SQL]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2706#p2706</link>
			<description><![CDATA[Witajcie wszyscy, to mój pierwszy post na tym forum.

Chciałbym dowiedzieć się jak najwięcej o dynamiczny sql, ale po przeszukaniu dosyć dokładnie Internetu, nie uzyskałem dobrze skomentowanych w miarę prostych przykładów wykorzystania. Dlatego postanowiłem napisać tutaj, bo może są wśród Was ludzie, którzy natchnęli się na ciekawe informacje na ten temat i chcieliby podzielić się linkami.

Poprawcie mnie jeśli źle rozumiem, ale czy to nie jest tak, że dynamiczny sql to po prostu polecenia sql wykonywane w ramach skryptów pl/sql w postgresie?

Dzięki za wszystkie sugestie
pozdrawiam
Gabryś]]></description>
			<author><![CDATA[dummy@example.com (filip11)]]></author>
			<pubDate>Sat, 10 Sep 2011 05:53:39 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2706#p2706</guid>
		</item>
	</channel>
</rss>
