powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записей в таблицу
12 сообщений из 12, страница 1 из 1
Вставка записей в таблицу
    #39412230
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Есть задача: Для клиента, созданного в предыдущем запросе, (найти можно по максимальному id клиента), продублировать заказы всех клиентов за 1990 год. (Здесь будет 2 запроса, для дублирования заказов и для дублирования позиций заказа).
Сразу поясню: есть две таблицы. Первая хранит номер заказа, вторая - позиции в заказе.
С первым запросом проблем не было. А как второй сделать не могу понять. Проблема заключается в том, что при выполнение первого запроса вставится три записи в первую таблицу и у них будут уникальные id, которые вставляются с помощью триггера.
Затем во вторую таблицу вставляю позиции товаров, но возникает проблема как мне соотнести к новому id несколько позиций? Т. е. конкретно для моего примера, в первом запросе у меня выбралось 3 записи, для этих трех записей существует 23 записи во второй таблицы (связь один ко многим): для первой записи - 8 записей из второй таблицы, для второй записи - 8 записей из второй таблицы и для 3 записи - 7 записей из второй таблицы.
И я не могу понять как соотнести для первой записи ( с новым id) 8 записей и так далее. Вставляю через select
В общем пните в нужном направлении.
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412239
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412259
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
спасибо, понял идею!)
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412270
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то написал, но ошибки полезли(
вот первый запрос:
insert into orders
(order_date, order_mode, customer_id, order_status, order_total, sales_rep_id, promotion_id)
select o.order_date,
o.order_mode,
(
select max(c.customer_id)
from customers c
) as customer_id,
o.order_status,
o.order_total,
o.sales_rep_id,
o.promotion_id
from orders o
where o.order_date >= date'1990-01-1' and o.order_date < date '1991-01-1'
;
вот второй:

insert into order_items
(order_id, line_item_id, product_id, unit_price, quantity)
select (
select a.order_id
from (
select *
from orders o
where o.customer_id = (
select max(c.customer_id)
from customers c
)
) a
join
(
select *
from orders o
where o.order_date >= date'1990-01-1' and o.order_date < date '1991-01-1'
order by o.order_id
) b
on a.order_date = b.order_date and a.order_id != b.order_id
where b.order_id = oi.order_id
) as order_id,
oi.line_item_id,
oi.product_id,
oi.unit_price,
oi.quantity
from order_items oi
where exists (
select o.order_id
from orders o
where o.order_date >= date'1990-01-1' and o.order_date < date '1991-01-1'
and o.order_id = oi.order_id
)
order by oi.order_id
;
а ошибки следующие:
ORA-04091: table NETCRACKER.ORDER_ITEMS is mutating, trigger/function may not see it
ORA-06512: at "NETCRACKER.INSERT_ORD_LINE", line 4
ORA-04088: error during execution of trigger 'NETCRACKER.INSERT_ORD_LINE'
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412279
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Person2713 , есть такая кнопочка, с надписью SRC . Выделили текст запроса, нажали кнопочку, и всем читать удобно и приятно...
Person2713
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
insert into orders 
  (order_date, order_mode, customer_id, order_status, order_total, sales_rep_id, promotion_id)
select  o.order_date,
        o.order_mode,
        (   
          select  max(c.customer_id)
            from  customers c
        ) as customer_id,
        o.order_status,
        o.order_total,
        o.sales_rep_id,
        o.promotion_id
  from  orders o
  where o.order_date >= date'1990-01-1' and o.order_date < date '1991-01-1'
;


вот второй:

Код: plsql
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.
insert into order_items
  (order_id, line_item_id, product_id, unit_price, quantity)
select  (
          select  a.order_id
            from  (
                select  *
                  from  orders o
                  where o.customer_id =  (   
                          select  max(c.customer_id)
                            from  customers c
                        ) 
                      ) a
                      join 
                      (
                select  *
                  from  orders o
                  where o.order_date >= date'1990-01-1' and o.order_date < date '1991-01-1' 
                  order by o.order_id
                  ) b
                  on a.order_date = b.order_date and a.order_id != b.order_id
                  where b.order_id = oi.order_id
        ) as order_id,
        oi.line_item_id,
        oi.product_id,
        oi.unit_price,
        oi.quantity
  from  order_items oi
  where exists (
    select  o.order_id
      from  orders o
      where o.order_date >= date'1990-01-1' and o.order_date < date '1991-01-1' 
      and o.order_id = oi.order_id    
      )
  order by oi.order_id
;


а ошибки следующие:
ORA-04091: table NETCRACKER.ORDER_ITEMS is mutating, trigger/function may not see it
ORA-06512: at "NETCRACKER.INSERT_ORD_LINE", line 4
ORA-04088: error during execution of trigger 'NETCRACKER.INSERT_ORD_LINE'
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412282
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viewer,
я забыл, про неё извеняюсь
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412306
_Llocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Person2713...Для клиента, созданного в предыдущем запросе, (найти можно по максимальному id клиента)...
RETURNING
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412344
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Llocust,

можете пояснить свой ответ, я не понимаю
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412351
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Person2713_Llocust,

можете пояснить свой ответ, я не понимаю returning_clause
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412475
_Llocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Person2713_Llocust,

можете пояснить свой ответ, я не понимаю

Очень плохо, что клиента, созданного в предыдущем запросе, вы собираетесь искать по максимальному id клиента. Т.к. если с системой одновременно работают 2 и более людей никто не гарантирует что вы получите "своего" клиента.
Собственно для получений id созданной записи есть специальная кляуза.

Ну а по вашему основному вопросу - хоть приведите тексты других объектов (триггеров)
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39412868
Person2713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По говорил с преподавателем и он объяснил в чем проблема. Проблема заключалась в том, что в таблице order_items был плохо написанный триггер для PK, а именно при вставке следующей записи он ссылался на предыдущее значение PK.
...
Рейтинг: 0 / 0
Вставка записей в таблицу
    #39413356
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Person2713В общем пните в нужном направлении.
не особо понял вопрос, но на всякий случай посмотри множественную вставку INSERT ALL
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записей в таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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