我是Oracle PL / SQL的新手......
Oracle Functions,Procedure&触发器?什么是适当的用途?
答案 0 :(得分:3)
触发器可以并且可能会使用函数和过程。
答案 1 :(得分:2)
这三种都是不同类型的PL / SQL块,这意味着您可以对多个SQL语句进行分组并使用变量,异常块等。程序和函数特别有助于重复使用,因此您不必在多个位置编写相同的逻辑,并且您可以授予某人/某些应用程序访问“执行某些操作”或“获取某些值”但不访问这些表的权限直接
解释不同用例的差异可能更好。 让我们考虑客户下订单的简单情况。
放置的每个订单都有一系列步骤,因此您可以拥有 PL / SQL块来执行该操作(执行一组sql语句)。程序是实现这一目标的方法。
/* this is usually part of a package and not a stand-alone procedure,
but everything else holds good */
create or replace procedure p_create_order(
i_product_id in products.product_type,
i_price in orders.price%type,
i_shipping_method in
i_state in address.state%type)
as
begin
insert into orders(item_id,
product_price,
tax_and_other_charges)
values (i_product_id,
i_price,
f_get_tax(i_price, i_state)); **---function call**
update inventory set quantity_on_hand = quantity_on_hand - 1;
insert into shipping_request(....) values(....)
commit;
end;
/
假设总税收计算基于一系列条件,您可以(并且应该)通过调用函数来避免在多个位置编码逻辑。函数只能返回一个值,这在大多数情况下是您所需要的。如果需要返回多个值,可以使用过程和输出参数。
create or replace function f_get_price(
i_price in product.price%type,
i_state in address.state%type)
return number
as
o_total_price number;
begin
select i_price *tax_per percent
into o_total_price
from state_tax
where state = i_state;
if(...some condition..)
then o_total_price = o_total_price*0.8
else...
...
end if;
return o_total_price;
end;
/
触发器用于完全不同的原因。如果要在满足某些条件(触发事件)时执行一组语句,则触发可能您的解决方案。
您可以在下面的链接中阅读有关其用例的更多信息。请注意,通常有一个oracle功能(如审计,版本控制)等已经到位,因此您不必使用触发器重新实现它。确保在开发解决方案之前进行研究,特别是使用触发器。
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#i1006211