помогите с примером,при выпонение задания

выполняю пример http://av5.com/journals-magazines-online/1/46/447
написанный для postgresql7.4.2

при выполнение запроса в postgresql 8.4
insert into orders(customer, goods_id, count, price, date)
values('Иванов Иван Иванович', 3, 1, 7302.00, '2004-07-15');

выдает ошибку "ERROR: record "new" is not assigned yet
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT: PL/pgSQL function "trigger_sl" line 14 at SQL statement"

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

А таблицу как создавали куда

А таблицу как создавали куда делаете INSERT?
И триггер с функцией как выглядят?
В общем давайте сюда всю последовательность действий (или дамп БД, где не работает), ибо читать всю ту муть, что дана по указанному URL и пробовать это всё ни времени ни желания нет

create table orders(order_id

CREATE TABLE orders(order_id serial, customer varchar, goods_id numeric(5), date date, count numeric(3), price numeric(7,2));

так создаю таблицы в sql редакторе на publish
потом триггерную функцию и сам триггер,на этапе запроса выдает ошибку в триг.функции.
CREATE OR REPLACE FUNCTION orders_after_insert()
returns TRIGGER AS'
DECLARE
whcount warehouse.count%type;
    rscount integer;
    rsorders integer;
    row reserved%rowtype;
BEGIN
--определяем количество на складе
select count into whcount
    from warehouse
    where goods_id = NEW.goods_id;
 if whcount < NEW.count then
--записываем сообщение о нехватке товара
    insert into goods_warnings(goods_id, message, date)
           values(NEW.goods_id, "Недостаточно на складе", now());
--проверяем, есть ли просроченные
    select count(count), sum(count) into rsorders, rscount
           from reserved
           where goods_id = NEW.goods_id and
                 date < now() - "5 day"::interval;
    if rscount + whcount >= NEW.count then
--отменяем просроченный заказ
           for row in select * from reserved where date < now() - "5 days"::interval loop
                update orders set status = "cancelled"
                        where order_id = row.order_id;
                 delete from reserved where order_id = row.order_id;
                 insert into orders_warnings(order_id, message, date)
                        values(row.order_id, "Заказ отменен", now());
           end loop;
--делаем новую запись в таблицу резерва
           insert into reserved(order_id, goods_id, count, date)
                 values(NEW.order_id, NEW.goods_id, NEW.count, NEW.date);
--заносим, если что-то осталось, на склад
           update warehouse set count = count + rscount - NEW.count
                 where goods_id = NEW.goods_id;
    else
--зарезервировать не удалось – заносим соответствующие пометки
           update orders set status = "not reserved"
                 where order_id = NEW.order_id;
           insert into orders_warnings(order_id, message, date)
                 values(NEW.order_id, 
"Товар по заказу не зарезервирован", now());
    end if;
else
--уменьшаем количество на складе
    update warehouse set count = count - NEW.count
          where goods_id = NEW.goods_id;
--делаем запись в таблице резерва
    insert into reserved(order_id, goods_id, count, date)
           values(NEW.order_id, NEW.goods_id, NEW.count, NEW.date);
end if;
return NEW;
End;'
LANGUAGE 'plpgsql';
END;
 
CREATE TRIGGER set_order after INSERT ON orders 
    execute procedure orders_after_insert();

а после выполнения запроса
INSERT INTO orders(customer, goods_id, count, price, date)
VALUES('Иванов Иван Иванович', 3, 1, 7302.00, '2004-07-15');

выдает ошибку
ERROR:  record "new" IS NOT assigned yet
DETAIL:  The tuple structure of a not-yet-assigned record IS indeterminate.
CONTEXT:  PL/pgSQL FUNCTION "orders_after_insert" line 16 at SQL statement
********** Ошибка **********
 
ERROR: record "new" IS NOT assigned yet
SQL state: 55000

как можно определить new?????
есть ли еще где нибудь подобные примеры на создание бд с триггерами?

А мне ошибку выдаёт уже на

А мне ошибку выдаёт уже на этапе создания функции:

ERROR:  invalid type name "warehouse.count%type"
КОНТЕКСТ:  compilation of PL/pgSQL FUNCTION "orders_after_insert" near line 2

Так что проверить по-прежнему ничего не могу.

Уточните определение тригера

Не проверял, но
триггеры бывают FOR STATEMENT или FOR EACH ROW
Первый выполняется до/после всего запроса, второй до/после изменения КАЖДОЙ строки:

INSERT INTO orders(customer, goods_id, count, price, date)
VALUES('Иванов Иван Иванович', 3, 1, 7302.00, '2004-07-15'),
        ('Петров Петр Петрович', 4, 2, 899.00, '2004-07-15'),
        ('Сидоров Сидор Серфимович', 3, 10, 7302.00, '2004-07-15')
;

Возможно, атрибуты NEW/OLD доступны только для "FOR EACH ROW"-триггера?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023