powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сделать update на master-таблицу
14 сообщений из 14, страница 1 из 1
Как сделать update на master-таблицу
    #32094253
kk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kk
Гость
Помогите новичку, плз ...
Пример: таблица А - заказы, таблица Б - товары.
При вставке нового товара (в таблицу Б) необходимо пересчитать
сумму заказа (в таблице А). Как это сделать? В триггере на
таблице Б?
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094266
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у тебя есть ограничение ссылочной целостности (foreign key constraint), то в триггере на ребенке скорее всего на мутацию родителя натолкнешься. Обычно мы делали так: в row-level-триггере after insert or update or delete на таблицу Б заполняли pl/sql таблицу идентификаторами заказа, сумму которых надо пересчитать, а потом в statement-триггере опять же на Б эти заказы в таблице А пересчитывали. Или можно сохранять суммы/изменения сумм каждой изменяющейся позиции, и потом корректировать сумму всего заказа.
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094278
kk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kk
Гость
а можно пример ??
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094416
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Длинный немного, но вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
create table master (
     master_id number( 9 )
   , amount    number( 15 ,  4 )
   , constraint pk_master primary key (master_id)
)
/
create table detail (
     detail_id number( 9 )
   , master_id number( 9 ) not null
   , amount    number( 15 ,  4 ) not null
   , constraint pk_detail primary key (detail_id)
   , constraint fk_detail_master foreign key (master_id)
       references master(master_id) on delete cascade
)
/
create or replace package pkg_master as
  type tbl_master is table of master%rowtype index by binary_integer;
       v_master tbl_master;
  procedure update_amount;
end;
/
create or replace package body pkg_master as
  procedure update_amount as
  begin
    if v_master.count >  0  then
      for i in v_master.first..v_master.last loop
        if v_master.exists(i) then
          update master set
            amount = nvl(amount,  0 ) + v_master(i).amount
          where  1 = 1 
            and master_id = v_master(i).master_id;
        end if;
      end loop;
      v_master.delete;
    end if;
  end;
end;
/

create or replace trigger taiudr_detail
after insert or update or delete on detail
for each row
begin
  if inserting or updating then
    pkg_master.v_master(:new.master_id).master_id := :new.master_id;
    pkg_master.v_master(:new.master_id).amount :=
      nvl(pkg_master.v_master(:new.master_id).amount,  0 ) + :new.amount;
  end if;
  if updating or deleting then
    pkg_master.v_master(:old.master_id).master_id := :old.master_id;
    pkg_master.v_master(:old.master_id).amount :=
      nvl(pkg_master.v_master(:old.master_id).amount,  0 ) - :old.amount;
  end if;
end;
/
create or replace trigger taiud_detail
after insert or update or delete on detail
begin
  pkg_master.update_amount;
end;
/

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SQL> insert into master(master_id) values ( 1 );

 1  row inserted

SQL> insert into detail(detail_id, master_id, amount) values ( 1 ,  1 ,  10 );

 1  row inserted

SQL> select * from master;

 MASTER_ID            AMOUNT
 ---------- -----------------
 
          1             10 . 0000 

SQL> insert into detail(detail_id, master_id, amount) values ( 2 ,  1 ,  20 );

 1  row inserted

SQL> select * from master;

 MASTER_ID            AMOUNT
 ---------- -----------------
 
          1             30 . 0000 

SQL> update detail set amount =  40  where detail_id =  1 ;

 1  row updated

SQL> select * from master;

 MASTER_ID            AMOUNT
 ---------- -----------------
 
          1             60 . 0000 

SQL> delete detail where detail_id =  2 ;

 1  row deleted

SQL> select * from master;

 MASTER_ID            AMOUNT
 ---------- -----------------
 
          1             40 . 0000 
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094436
kk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kk
Гость
Спасибо !
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094512
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хочу никиго обидеть, но подход предложенный Denis Popov. Это плохой подход. Покрайней мере если колиента писать на Oracle Form возникают проблемы.
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094545
Um
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажись подход Denis Popov стандартный для борьбы с мутирующими таблицами, он еще у Урмана описан.
А какие с ним проблемы в Forms?
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094558
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в триггере происходит изменнение каких -то полей таблицы( например поля STATUS ) и это поле отображаеться в форме, то потом невозможно заставить формы перечитать это поле. приходиться делать перечитку руками.

Это только одна из проблем.Всех вспомнить не могу. Как появяться еще напишу. Люди которые очень давно работают с оракле и формами очень ну очень сильно ругаються если так делать.
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094575
Um
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну это Forms лажает... без триггеров никак не обойтись...
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094649
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишим проект который начинали писать индусы. Т.е они его написали . А мы перепесмвыем его под нашу страну. ТАк они умудрились написать без этих триггеров. И все работает!! )). Кстати пишут они очень аккуратно.
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094667
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выхода тут два:
1. Избавиться от поля суммы всего заказа, вычисляя его "на лету". Кстати, первые этой абзацы статьи "Информационная система и реляционная СУБД" декларируют это: http://www.oracle.com/ru/oramag/novdec2002/index.html?general_rdbms.html

2. Изменять таблицы закаков и его позиций только через процедуры. В них уже можно накрутить логику дополнительного обсчета, если было принято решение хранить поле суммы заказа.

Интересно, а нарушает ли это поле какую-нибудь нормальную форму?
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32094872
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prosch ispolzovat avtonomnuyu tranzakciu dlia master-tablici.
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32095010
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to ShgGena
а можно раскрыть тему, если нетрудно :)
...
Рейтинг: 0 / 0
Как сделать update на master-таблицу
    #32095695
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov wrote:
>>Интересно, а нарушает ли это поле какую-нибудь нормальную форму?
Никакую нормальную форму это не нарушает.
Это нарушает принцип недопущения избыточности информации, который сводится к тому, что не следует хранить в БД информацию, которая может быть получена(вычислена) по информации уже находящейся в БД. Хотя с практической точки зрения хранение суммы в самом заказе возможно вполне оправдано, зависит от приложения и критических ресурсов сервера.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сделать update на master-таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]