1

Temat: procedury i triggery

Witam. Mam taki problem. Stworzyłem funkcję, która ma zmniejszać stan magazynu gdy jakiś towar zostanie zamówiony:



CREATE OR REPLACE FUNCTION zabierz()
  RETURNS trigger AS
$BODY$

BEGIN

UPDATE towary SET towary.stan = towary.stan - faktura.ilosc
WHERE towary.id_towaru = faktura.id_towaru;
RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION zabierz() OWNER TO postgres;


CREATE TRIGGER zabierzzmagazynu
  AFTER INSERT
  ON faktura
  FOR EACH STATEMENT
  EXECUTE PROCEDURE zabierz();


CREATE TABLE faktura
(
  id_faktury integer NOT NULL,
  data_wystawienia date,
  nazwa_towaru character varying(20),
  ilosc integer,
  jm character varying(5),
  cena_netto money,
  vat integer,
  id_naglowek integer,
  id_towaru integer,
  CONSTRAINT faktura_pkey PRIMARY KEY (id_faktury)
)

CREATE TABLE towary
(
  id_towaru integer NOT NULL,
  nazwa_towaru character varying(20),
  "iloscWmagazynie" integer,
  jm character varying(5),
  cena_netto money,
  vat integer,
  stan integer,
  CONSTRAINT towary_pkey PRIMARY KEY (id_towaru)
)


Gdy dodaję towar do faktury wyskakuje mi błąd:

insert into faktura (id_faktury, data_wystawienia, nazwa_towaru, ilosc,
jm, cena_netto, vat, id_naglowek, id_towaru) values ('3', '20101112','Pioro','20
','szt.','3,5','23','1','9');
ERROR:  column towary.iloscwmagazynie does not exist
LINE 1: UPDATE towary SET towary.iloscWmagazynie = towary.iloscWmaga...
                                                   ^
QUERY:  UPDATE towary SET towary.iloscWmagazynie = towary.iloscWmagazynie - fakt
ura.ilosc
WHERE towary.id_towaru = faktura.id_towaru
CONTEXT:  PL/pgSQL function "zabierz" line 4 at SQL statement

Czy nie można stosowac tutaj aliasów? Nie wiem jak sobie z tym poradzić. Czy ktoś mógłby mnie jakoś naprowadzić w jaki sposób zdjąć towar ze stanu magazynu? Dopiero zaczynam zabawę z bazami. Proszę o wyrozumiałość.

2

Odp: procedury i triggery

Jesteś pewien że ta funkcja, którą nam pokazujesz jest wywoływana prze triggera?
Takiwego update  w tej funkcji nie ma

UPDATE towary SET towary.iloscWmagazynie = towary.iloscWmagazynie - fakt
ura.ilosc

Po pierwsze nie jest dobrze jak przy tworzeniu tabel i nazywaniu kolumn uzywasz " ", bo w postgresie
"iloscWmagazynie" to nie to samo co iloscWmagazynie. Więc proponowałnym zmienic nazwy wszystkich kolumn na pisane bez " ".
Druga sprawa, UPDATE w procedurze korzysta z dwóch tabel towary i faktura nie jestem pewien czy to dobrze tu zadziala. Czy nie bedzie potrzebny jakis zagniezdzony select.

Ostatnio edytowany przez rski (2011-02-02 21:35:02)