这怎么可能?用过程还是用触发器?
我猜也不是。 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 它)