function 和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure 不需要返回任何值, 而function将返回一个值. 在另一方面,Package是为了完成一个商业功能的一组function和procedure的集合。
综上,FUNCTION、PROCEDURE和PACKAGE在返回值、调用方式、SQL语句、类型说明、编译和包内元素等方面均存在差异。
下面是一个简单的Oracle FUNCTION、PROCEDURE和PACKAGE的例子:
FUNCTION例子
sql
CREATE OR REPLACE FUNCTION get_salary (emp_id IN NUMBER) RETURN NUMBER IS ?
? salary NUMBER; ?
BEGIN ?
? SELECT salary INTO salary FROM employees WHERE id = emp_id; ?
? RETURN salary; ?
END get_salary;
这个函数接受一个员工ID作为输入参数,并返回该员工的工资。
PROCEDURE例子
sql
CREATE OR REPLACE PROCEDURE increase_salary (emp_id IN NUMBER, increase IN NUMBER) IS ?
BEGIN ?
? UPDATE employees SET salary = salary + increase WHERE id = emp_id; ?
END increase_salary;
这个过程接受一个员工ID和一个增加的工资数作为输入参数,并将该员工的工资增加指定的数量。
PACKAGE例子
首先,创建一个包规范(PACKAGE SPECIFICATION):
sql
CREATE OR REPLACE PACKAGE emp_package AS ?
? FUNCTION get_salary (emp_id IN NUMBER) RETURN NUMBER; ?
? PROCEDURE increase_salary (emp_id IN NUMBER, increase IN NUMBER); ?
END emp_package;
然后,创建包体(PACKAGE BODY):
sql
CREATE OR REPLACE PACKAGE BODY emp_package AS ?
? FUNCTION get_salary (emp_id IN NUMBER) RETURN NUMBER IS ?
? ? salary NUMBER; ?
? BEGIN ?
? ? SELECT salary INTO salary FROM employees WHERE id = emp_id; ?
? ? RETURN salary; ?
? END get_salary; ?
? ??
? PROCEDURE increase_salary (emp_id IN NUMBER, increase IN NUMBER) IS ?
? BEGIN ?
? ? UPDATE employees SET salary = salary + increase WHERE id = emp_id; ?
? END increase_salary; ?
END emp_package;
这个包规范定义了两个对象:一个函数和一个过程。包体实现了这两个对象的具体逻辑。通过将相关的函数和过程组织到一个包中,可以方便地管理和维护相关的代码。