psani funkce v pgsql
Karel Zak
zakkr na zf.jcu.cz
Středa Listopad 20 10:32:02 CET 2002
On Wed, Nov 20, 2002 at 06:02:38AM +0000, Pavel Stehule wrote:
> V Perlu a Pythonu nevim, ale rekl bych, ze ne, jelikoz
> pro pristup k tabulkam pouzivaji SPI, pricemz se dotaz
> konstruje dynamicky. V C se pouziva SPI, takze jako dotaz
> datavate string. Jsou tam somozrejme uplne jine konstrukce.
Toto rozhrani pochopitelne pouziva i PL/SQL. To na cem zalezi je jak
se pouziva. PL/pgSQL u dotazu SELECT INTO zpracovani pomoci
SPI_saveplan coz znamena, ze dotaz se preparsuje a dale se pouziva
tato predpripravena podoba a pri pouziti dotazu se jen doplni data.
Pochopitene, aby se ten dotaz pripravil tak musi byt znamo jakych
tabulek se to tyka. U funkci typu ciste PL/SQL (!=PL/pgSQL) je to
myslim vzdy takto.
Druhou moznosti v PL/pgSQL je EXECUTE. Kdy string dorazu je
zpracovavan vzdy. To znamena, ze tam muze byt i nazev tabulky
dynamicky. Jiny je vsak v tomto pripade pristup k vysledku (nelze
SELECT INTO) a je nutne pouzit FOR-IN-EXECUTE.
> >> dotaz EXECUTE ''SELECT ...'' || $1, ale nevim
> >> jestli Vam to naplni promennou.
> >
> > nenaplni
Hu?
CREATE TABLE gogo (data text);
CREATE OR REPLACE FUNCTION add(text, text) RETURNS int AS '
DECLARE q text;
BEGIN
q = ''INSERT INTO ''|| $1 ||'' VALUES( '' ||
quote_literal( $2 ) || '')'';
EXECUTE q;
RETURN 1;
END;
' LANGUAGE 'plpgsql';
SELECT add('gogo', 'moje data');
add
-----
1
SELECT * FROM gogo;
data
-----------
moje data
Vice dokumentace:-)
http://developer.postgresql.org/docs/postgres/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN-QUERIES
http://developer.postgresql.org/docs/postgres/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING
Karel
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
Další informace o konferenci Test