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