как это возможно? с процедурой или с триггером?
Не думаю, ни. 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
, если это возможно)