Oracle PL / SQL函数 - 在同一循环中更新和选择

时间:2016-10-13 10:26:31

标签: sql oracle plsql

我想知道如何让我的功能更有效率。另外我认为update语句没有处理,因为它发生在与同一个表上的select语句相同的循环迭代中。我想知道如何编写这个函数以提高效率并实际工作。我在订单完成时在触发器中使用此功能。 提前谢谢。

select table1.sale_date
from sales table1 where 
table1.sale_date in ( 
    (select debt_date::date from debtors where debt_date between   
     debt_date::date - 3 and  debt_date::date + 4);

3 个答案:

答案 0 :(得分:1)

我认为整个过程可以简化为单个MERGE语句。不需要(嵌套)循环:

merge into voorraad v
using
(
   select r5.product_product_id, r5.gewicht, v.restvoorraad, v.restvoorraad - r5.gewicht as result
   from relation_6 r6 
     join relation_5 r5 on r5.recept_recept_id= r6.recept_id
     join voorraad v on v.product_product_id = r5.product_product_id
   where r6.dieet_id = p_dieet_id 
) t ON (t.product_product_id = v.product_id)
when matched then update
  set restvoorraad = t.result;

内部查询是为每个产品计算restvoorraad的新值的逻辑。我不认为我得到了所有连接,但是如果你能编写一个正确计算它的SELECT查询,只需将其插入MERGE语句。

答案 1 :(得分:0)

通过使用没有游标和逐行处理的SQL语句,您将获得更好的性能。

答案 2 :(得分:0)

我相信这种合并是正确的,并且比游标更有效:

merge into voorraad v
using (select r5.* from relation_5 r5 inner join relation_6 r6 on (r6.recept_id = r5.recept_recept_id) where r6.dieet_id=p_dieet_id) r
on (r.product_product_id = v.product_product_id)
update set v.restvoorraad = v.restvoorraad_id - r.gewicht;