Dotaz na konkretni vyuziti RULE v PG 7.1.3

Otakar Kleps kleps na avonet.cz
Pátek Únor 1 13:09:37 CET 2002


Dekuji za vycerpavajici odpoved

Ota Kleps

Karel Zak wrote:

> On Fri, Feb 01, 2002 at 09:52:48AM +0100, Otakar Kleps wrote:
> 
>>Dobry den,
>>
>>potreboval bych provest automaticky inkrement pri provadeni SQL 
>>selectu(nechce se mi to provadet na urovni aplikace).
>>Tedy neco ve smyslu (je to samozrejme spatne ;-):
>>
>>CREATE RULE rule_xyz AS ON select TO tbl_xyz DO UPDATE col_inc=col_inc+1;
>>
> 
>  To je problem. Duvodem je to, ze to chcete u selectu. Prvni vec je,
>  ze rule "ON SELECT" musi mit definovany ten dotaz (ve vasem pripade
>  update) jako INSTEAD protoze on to vnitrne predela na VIEW. Tedy 
> 
>     CREATE RULE xxx_r AS ON SELECT TO xxx DO INSTEAD
>     SELECT a, b, c FROM xxx;
> 
>  je stejne jako:
> 
>     CREATE VIEW xxx_v AS SELECT a, b, c FROM xxx;
> 
>  Dalsi problem je, ze v ON SELECT nejsou pristupne veci jako je 
> old/new.
> 
> 
>  Asi bych se to snazil resit nejakou funkci:
> 
>  CREATE TABLE tab (id int, data text, counter int DEFAULT 0);
> 
>  SELECT * FROM tab;
>  id | data | counter
> ----+------+---------
>   1 | aaa  |       0
>   3 | ccc  |       0
>   2 | bbb  |       1
> 
>  CREATE FUNCTION upd_counter(int) RETURNS int AS 
>     'UPDATE tab SET counter=counter+1 WHERE id = $1; 
>      SELECT 1' 
>  LANGUAGE 'SQL';
> 
>  SELECT id, data, upd_counter(id) FROM tab WHERE data='xxx';
> 
>  
>  Je-li to pro vas efektivni postup necham na vas a vasi aplikaci:-)
> 
>  IMHO vsude tam kde je predpoklad, ze ten select vrati vice jak 1 
>  radku to moc efektivni neni, protoze samostatnym dotazem UPDATE se
>  stejnou podminkou WHERE dosahnete vetsi rychlosti nez v tomto pripade 
>  kdy pro kazde 'id' je proveden update (v te funkci) samostatne.
> 
>         Karel




Další informace o konferenci Test