子程序是包含很多 SQL 和 PL 语句的 PL 单元,以解决特定的问题或者进行一组相关的任务。子程序可以包含参数,具体值由调用者传入。子程序可以是一个存储过程或者函数。典型的用法是使用存储过程进行一个操作,使用函数进行计算并返回一个值。

存储子程序是存储在数据库内部的子程序,为很多不同数据库应用程序实现复杂的逻辑运算。 存储子程序包含如下两类:

  • 独立的子程序,是在 SCHEMA 内创建的子程序。

  • 包内部的子程序,是在包体内部创建的子程序。

独立的子程序对测试程序逻辑很方便,但是大量的子程序对管理不是很方便。因此建议在程序逻辑确定后,将独立的子程序按照业务模块放到不同的包里。

子程序是其他可维护性功能的重要组成部分,例如程序包和触发器等。

子程序结构

子程序结构跟 STORED PROCEDURE 结构一致,包括:

  • 声明部分(可选)

    声明部分包括类型、常量、变量、异常、显式游标和嵌套子程序的声明。这些项对于子程序都是本地的,当子程序执行结束时就都不存在了。

  • 执行部分(必选)

    执行部分包括赋值语句、控制执行语句和数据操作语句。

  • 异常处理部分(可选)

    异常处理部分包括处理异常(运行时错误)的代码。

在子程序中添加注释会增加程序的可读性,注释可以出现在 STORED PROCEDURE 子程序的任意位置,STORED PROCEDURE 编译器会忽略注释。单行注释是以双横线(—)开头的,注释范围到行尾截止。多行注释可以以斜杠和星号(/*)开头,以星号和斜杠(*/)结尾。

一个存储过程的结构如下:

  1. PROCEDURE name [ ( parameter_list ) ]
  2. { IS | AS }
  3. [ declarative_part ]
  4. BEGIN -- executable part begins
  5. statement; [ statement; ]...
  6. [ EXCEPTION ]
  7. exception_handler; [ exception_handler; ]... ]
  8. END;

函数的结构如下,与存储过程相比,多了至少一个 RETURN 子句:

  1. FUNCTION name [ ( parameter_list ) ] RETURN data_type [ clauses ]
  2. { IS | AS }
  3. [ declarative_part ]
  4. BEGIN
  5. -- 至少有一句 RETURN 语句
  6. statement; [ statement; ]...
  7. [ EXCEPTION ]
  8. exception_handler; [ exception_handler; ]... ]
  9. END;

PROCEDURE 和 FUNCTION 跟 IS | AS 之间的代码是子程序的声明,声明部分、执行部分和异常处理部分是子程序的内容体。