В Oracle как создать хранимую процедуру для вставки значения в 2 таблицы - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь вставить ниже детали в две таблицы. но это показывает ошибку. где я не прав?

create or replace PROCEDURE ADD_customer_order( 
customer_id in varchar, Shipping_id_arg in number,
order_date_arg in date, Total_price_arg in decimal,
inventory_id_arg in number, order_quantity_arg in number) 
AS
BEGIN
INSERT INTO customer_order (customer_id,Shipping_id,Order_date,total_price) VALUES(customer_id_arg,Shipping_id_arg,order_date_arg, total_price_arg); 
insert into order_details (inventory_id,order_quantity) values(scope_identity(),inventory_id_arg,order_quantity_arg); 
END;

1 Ответ

0 голосов
/ 29 апреля 2020

Это помогает, если вы правильно отформатируете его.

create or replace procedure add_customer_order( 
  customer_id      in varchar2, shipping_id_arg in number,
  order_date_arg   in date    , total_price_arg in decimal,
  inventory_id_arg in number  , order_quantity_arg in number) 
as
begin
  insert into customer_order 
  (customer_id    , shipping_id    , order_date    , total_price) 
  values
  (customer_id_arg, shipping_id_arg, order_date_arg, total_price_arg); 

  insert into order_details 
  (                  inventory_id    , order_quantity) 
  values
  (scope_identity(), inventory_id_arg, order_quantity_arg); 
end;

При этом вы легко заметите, что второй INSERT недопустим, поскольку вы вставляете 3 значения в 2 столбца:

  insert into order_details 
  (                  inventory_id    , order_quantity) 
  values
  (scope_identity(), inventory_id_arg, order_quantity_arg); 

Либо удалите scope_identity() (что это?), Либо добавьте дополнительный столбец в список столбцов, в который вы вставляете.


После прочтения вашего комментария кажется, что returning пункт может помочь. Посмотрите на следующий пример (несколько проще, чем у вас; не хотелось печатать так много). Триггер используется для автоинкрементации ORDER_ID столбца. в таблице CUSTOMER_ORDER (я нахожусь на 11g XE; здесь нет столбцов идентификаторов).

SQL> create table customer_order (order_id number, customer_id number);

Table created.

SQL> create table order_details (order_id number, inventory_id number);

Table created.

SQL> create sequence seqo;

Sequence created.

SQL> create or replace trigger trg_co
  2    before insert on customer_order
  3    for each row
  4  begin
  5    :new.order_id := seqo.nextval;
  6  end;
  7  /

Trigger created.

Процедура: обратите внимание на локальную переменную, объявленную в строке № 4 и в предложении returning в строке № 7 :

SQL> create or replace procedure p_test
  2    (par_customer_id in number, par_inventory_id in number)
  3  is
  4    l_order_id   customer_order.order_id%type;
  5  begin
  6    insert into customer_order (customer_id) values (par_customer_id)
  7    returning order_id into l_order_id;
  8
  9    insert into order_details (order_id, inventory_id)
 10    values (l_order_id, par_inventory_id);
 11  end;
 12  /

Procedure created.

Тестирование:

SQL> exec p_test(100, 200);

PL/SQL procedure successfully completed.

SQL> exec p_test (235, 2230);

PL/SQL procedure successfully completed.

SQL> select * From customer_order;

  ORDER_ID CUSTOMER_ID
---------- -----------
         1         100
         2         235

SQL> select * From order_details;

  ORDER_ID INVENTORY_ID
---------- ------------
         1          200
         2         2230

SQL>

В обеих таблицах используется одинаковое значение ORDER_ID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...