模块化

模块化

模块化可以让我们把程序分成多个部分,这样可以把复杂的问题划分开来,更好的解决问题。PL/SQL为我们提供了块、子程序和包三个程序单元来用于模块化处理。

  • 子程序

子程序有两种,分别是函数和过程。子程序很像一段小型的程序,由可选的声明部分,执行控制部分和可选的异常控制部分组成。

PROCEDURE award_bonus(emp_id NUMBERIS
  bonus          
REAL;
  comm_missing   
EXCEPTION
;
BEGIN   -- executable part starts here

  
SELECT comm * 0.15
    
INTO
 bonus
    
FROM
 emp
   
WHERE
 empno = emp_id;

  
IF bonus IS NULL THEN

    
RAISE comm_missing;
  
ELSE

    
UPDATE payroll
       
SET
 pay = pay + bonus
     
WHERE
 empno = emp_id;
  
END IF
;
EXCEPTION   -- exception-handling part starts here

  
WHEN comm_missing THEN
    ...
END award_bonus;

调用时,这个过程接受一个雇员编号。它使用编号来查询雇员的commission,同时计算出15%的奖金。然后,它检查bonus总值。如果奖金为空,就会抛出异常,否则雇员的工资记录就会被更新。

  • 包(Package)

PL/SQL可以让我们把逻辑相关的类型、变量、游标和子程序放在一个包内,这样更加清楚易理解。包通常有两部分组成:包说明部分和包体部分。包说明部分是应用程序的接口,它"声明"了类型、常量、变量、异常、游标和可以使用的子程序。包体用于实现包说明部分声明的子程序和游标。

下面的例子是把两个雇用相关的过程进行打包:

CREATE PACKAGE emp_actions AS   -- package specification
  
PROCEDURE hire_employee(empno NUMBER, ename CHAR, ...);

  
PROCEDURE fire_employee(emp_id NUMBER
);
END
 emp_actions;

CREATE PACKAGE BODY emp_actions AS   -- package body

  
PROCEDURE hire_employee(empno NUMBER, ename CHAR, ...); IS
  
BEGIN
    
INSERT INTO emp
         
VALUES
 (empno, ename, ...);
  
END
 hire_employee;

  
PROCEDURE fire_employee(emp_id NUMBERIS

  
BEGIN
    
DELETE FROM emp
          
WHERE
 empno = emp_id;
  
END
 fire_employee;
END emp_actions;

只有在包说明中声明的内容对应用程序是可见的,而包体中的内容是不可见,无法访问的。包被编译后会存放到数据库中,当我们首次调用包中的子程序时,整个包就会被加载到内存当中,所以,后续的调用不再涉及到磁盘的读取问题。因此,包可以提高效率改善性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值