<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Dynamiczny SQL]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=637&amp;type=atom"/>
	<updated>2011-09-11T08:26:32Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=637</id>
		<entry>
			<title type="html"><![CDATA[Odp: Dynamiczny SQL]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2708#p2708"/>
			<content type="html"><![CDATA[super, bardzo dziękuję za tą odpowiedź, na pewno się zapoznam z nią oraz z podaną książką :)]]></content>
			<author>
				<name><![CDATA[filip11]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1274</uri>
			</author>
			<updated>2011-09-11T08:26:32Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2708#p2708</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Dynamiczny SQL]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2707#p2707"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2011-09-10T12:56:51Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2707#p2707</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Dynamiczny SQL]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2706#p2706"/>
			<content type="html"><![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ś]]></content>
			<author>
				<name><![CDATA[filip11]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1274</uri>
			</author>
			<updated>2011-09-10T05:53:39Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2706#p2706</id>
		</entry>
</feed>
