功能,程序&触发器 - 它们有何不同,何时使用?

时间:2011-12-01 06:20:48

标签: oracle oracle9i

我是Oracle PL / SQL的新手......

Oracle Functions,Procedure&触发器?什么是适当的用途?

2 个答案:

答案 0 :(得分:3)

  • 功能和程序: 基本上只是你随意运行的一段代码。在任何语言中,Function都会返回一个值(例如'更新的行数,字符串等'),并且Procedure不会返回任何值。
  • 触发器:由于事件而运行的代码片段;例如,您有一个表,并且您希望在每次插入此表后,您将收到一封电子邮件 - 然后在myImportant表上定义一个AFTER INSERT触发器,并告诉它向您发送一封包含最近Insert的内容的电子邮件。

触发器可以并且可能会使用函数和过程。

答案 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