Ciselna rada po uzivatele

Pavel Stehule stehule na kix.fsv.cvut.cz
Středa Prosinec 17 15:16:08 CET 2003


Pro mysql vubec netusim. Pro PostgreSQL bych teoreticky mohl bez pouziti 
ulozenych procedur se vejit do dvou prikazu
BEGIN
  INSERT INTO tab SELECT FOR UPDATE;
  UPDATE ..
END;

s pouzitim vlastni funkce s vedlejsim efektem

CREATE OR REPLACE obj(text) RETURNS integer AS '
DECLARE id AS integer;
BEGIN
  SELECT id INTO id FROM .. WHERE neco=$1 FRO UPDATE;
  UPDATE  tab SET id = id + 1 WHERE neco = $1;
  RETURN id;
END; 'LANGUAGE plpgsql;

a pak INSERT INTO ibjed VALUES (obj('prijmeni'));

ale je to v podstate prepis pouze prvni varianty. Jenomze mysql nema 
ulozene procedury, takze jsem Vam vubec nepomohl :-(. 

Pavel Stehule



On Wed, 17 Dec 2003, Zdenek Bohm wrote:

> > Zkuste napsat vic, netusim jakou mate databazi, co chcete delat s temi 
> > cisli. Obecne by se to mohlo vyresit asi takto
> > 
> > BEGIN
> >   SELECT cislo FROM tab WHERE id=neco FOR UPDATE;
> >   ......
> >   ......
> >   UPDATE tab SET cislo = CISLO + 1 WHERE id=neco;
> > COMMIT;
> 
> Pardon, mel jsem se vic rozepsat. Cele to bezi na MySQL. Vyse zmineny 
> postup s vyselektovanim posledniho cisla, jeho inkrementovanim a 
> naslednym pridanim zaznamu me taky napadl. Ale rad bych to prave takto 
> neudelal.
> Jde o tabulku do niz se ukladaji hlavicky objednavek - uzivatel jehoz 
> udaje jsou ulozeny v jine tabulce svazane s touto pres ID_Uzivatel si 
> neco objedna a do teto tabulky je ulozen zaznam, ze to byl on, kdy to 
> udelal atd. a krome toho, pro dohledani je teto objednavce prirazeno cislo.
> Nejjednoduseji to samozrejme jde udelat tak, ze sloupec Cislo se 
> nadefinuje jako AUTO_INCREMENT a pak kdyz vlozim do tabulky dalsi zaznam 
> , automaticky se ji priradi dalsi cislo v poradi. Ovsem za situace, kdy 
> chronologicky objedna uzivatel s ID=1, pak uzivatel s ID=2 a pak zase 
> ten s ID=1 bude vysledek ten, ze uzivatel s ID=1 bude mit objednavky 
> cislo 1 a 3 a uzivatel s ID=2 bude mit objednavku s cislem 2. Ja bych 
> prave rad docilil stavu, kdy kazdy uzivatel by mel vlastni neprerusenou 
> ciselnou radu objednavek. Proste aby patnacta objednavka uzivatele 1 
> mela cislo 15 bez ohledu na to, kolik jinych uzivatelu mezitim objednalo.
> A docela by se mi hodilo, pokud by to slo udelat jen prostrednictvi 
> jednoho INSERTU do vhodne nadefinovane tabulky (neco jako AUTO_INCREMENT 
> jehoz "nejblizsi volnou" hodnotu ovlivnuje take obsah sloupce 
> ID_Uzivatel). Bohuzel me nenapadlo (ani jsem nikde nenasel), jak by to 
> slo zaridit (jestli vubec...), proto se ptam.
> 
> S pozdravem Zdenek Bohm
> 



Další informace o konferenci Databases