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