Dotaz na konkretni vyuziti RULE v PG 7.1.3

Karel Zak zakkr na zf.jcu.cz
Pátek Únor 1 11:49:30 CET 2002


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

-- 
 Karel Zak  <zakkr na zf.jcu.cz>
 http://home.zf.jcu.cz/~zakkr/
 
 C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz


Další informace o konferenci Databases