Как выбрать записи perticular из таблицы1 и вставить в таблицу2? - PullRequest
0 голосов
/ 30 апреля 2020

Изображение_1 - это «таблица_1: -Продукт»

Product table with 3 column here (P_id,P_name,P_amount)

Изображение 2 - это «таблица_2: -Пользователь_деталь»

User_detail table with 5 column here (u_id,u_name,email,purchased_item,amount_total,due_date)

Теперь я хочу выбрать данные из таблицы table_1 (p_name, p_amount) с использованием определенного «p_id» с «prompt» и вставить в table_2 (купленный_item, amount_total, due_date) в конкретный выбор «u_id»

  • p_name-> купленный_элемент
  • p_amount-> amount_total
  • due_date - sysdate

Ожидаемый результат: - Если я выбрал «p_id = 101» из таблицы_1 и « u_id = 3676 "из таблицы_2, тогда я получаю это обновление в таблице_2 ---

" row-1 "

u_id:-3676
u_name:-Rv
email:-rv@gmail.com
purchased_item:-LED
amount_total:-5000
due_date:-sysdate

, пожалуйста, помогите мне, как это возможно? с процедурой или с триггером?

спасибо в продвинутом.

Я - новый pl / sql ученик.

1 Ответ

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

как это возможно? с процедурой или с триггером?

Не думаю, ни. UPDATE будет делать.

update user_detail d set
  (d.purchased_item, d.amount_Total, d.due_Date) =
  (select p.p_name, p.p_amount, sysdate
   from product p
   where p.p_id = :par_p_id
  )
where d.u_id = :par_u_id;

Если это должна быть процедура, тогда

create or replace procedure p_iud (par_p_id in product.p_id%type,
                                   par_u_id in user_detail.u_id%type
                                  )
as
begin
  update user_detail d set
    (d.purchased_item, d.amount_Total, d.due_Date) =
    (select p.p_name, p.p_amount, sysdate
     from product p
     where p.p_id = par_p_id
    )
  where d.u_id = par_u_id;
end;
/

Назовите ее как

begin
   p_iud(101, 3676);
end;
/

Если вы хотите передать несколько продуктов одновременно, один из вариантов - передать их в виде строки с разделенными запятыми значениями. Тогда процедура будет

create or replace procedure p_iud (par_p_id in varchar2,
                                   par_u_id in user_detail.u_id%type
                                  )
as
begin
  update user_detail d set
    (d.purchased_item, d.amount_total, d.due_Date) =
    (select listagg(p.p_name, ',') within group (order by p.p_name), 
            sum(p.p_amount), 
            sysdate
     from product p
     where p.p_id in (select to_number(regexp_substr(par_p_id, '[^,]+', 1, level))
                      from dual
                      connect by level <= regexp_count(par_p_id, ',') + 1
                     )
    )
  where d.u_id = par_u_id;
end;
/

, и вы будете называть ее

begin
   p_iud('101,301', 3676);
end;
/

Возможная проблема: поскольку LISTAGG объединяет все эти названия продуктов, произойдет сбой, если такой "длинная" строка слишком длинная для столбца PURCHASED_ITEM (вы можете SUBSTR, если это возможно)

...