Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записей в таблицу / 12 сообщений из 12, страница 1 из 1
01.03.2017, 11:02
    #39412230
Person2713
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записей в таблицу
Всем привет. Есть задача: Для клиента, созданного в предыдущем запросе, (найти можно по максимальному id клиента), продублировать заказы всех клиентов за 1990 год. (Здесь будет 2 запроса, для дублирования заказов и для дублирования позиций заказа).
Сразу поясню: есть две таблицы. Первая хранит номер заказа, вторая - позиции в заказе.
С первым запросом проблем не было. А как второй сделать не могу понять. Проблема заключается в том, что при выполнение первого запроса вставится три записи в первую таблицу и у них будут уникальные id, которые вставляются с помощью триггера.
Затем во вторую таблицу вставляю позиции товаров, но возникает проблема как мне соотнести к новому id несколько позиций? Т. е. конкретно для моего примера, в первом запросе у меня выбралось 3 записи, для этих трех записей существует 23 записи во второй таблицы (связь один ко многим): для первой записи - 8 записей из второй таблицы, для второй записи - 8 записей из второй таблицы и для 3 записи - 7 записей из второй таблицы.
И я не могу понять как соотнести для первой записи ( с новым id) 8 записей и так далее. Вставляю через select
В общем пните в нужном направлении.
...
Рейтинг: 0 / 0
01.03.2017, 11:11
    #39412239
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записей в таблицу
...
Рейтинг: 0 / 0
01.03.2017, 11:36
    #39412259
Person2713
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записей в таблицу
Elic,
спасибо, понял идею!)
...
Рейтинг: 0 / 0
01.03.2017, 11:55
    #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
01.03.2017, 12:00
    #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
01.03.2017, 12:01
    #39412282
Person2713
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записей в таблицу
Viewer,
я забыл, про неё извеняюсь
...
Рейтинг: 0 / 0
01.03.2017, 12:31
    #39412306
_Llocust
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записей в таблицу
Person2713...Для клиента, созданного в предыдущем запросе, (найти можно по максимальному id клиента)...
RETURNING
...
Рейтинг: 0 / 0
01.03.2017, 13:02
    #39412344
Person2713
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записей в таблицу
_Llocust,

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

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

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

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

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


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