Re: [Postgresql-it] Problema teorico - multi progressivo

  • From: Enrico <scotty@xxxxxxxxxxxx>
  • To: postgresql-it@xxxxxxxxxxxxxxxxx
  • Date: Sun, 27 Feb 2005 20:55:46 +0100

max jacob wrote:

avevo scritto un po' di tempo fa un'estensione in c per fare sta roba... se vuoi la rispolvero e te la passo. però ora sull'8 credo credo che abbiano risolto dei problemi di isolazione delle funzioni plpgsql per cui probabilmente puoi semplicemente scrivere una funzione che fa la stessa cosa. il principio è banale:

create table contatori ( id text not null primary key, value int );

create function contatore_next( text ) returns int as '

declare
   v int;

begin
select into v value from contatori where id = $1 for update; -- for update e' necessario per lockare la riga
   if not found
      -- inserisce la riga
lock table contatori; -- cosi' nessuno rischia di inserire un contatore con id uguale causando errore.
      insert into contatori ( id, value ) values ( $1, 1 );
      return 1
   else
      -- incrementa e ritorna
      v:=v+1;
      update contatori set value = v where id = $1;
      return v;
   end;

end;

' language plpgsql;


(l'ho scritta a braccio direttamente nella mail, magari c'è qualche errorino...)

Tnx domani mattina la controllo e la provo

Other related posts: