包用于邏輯組合相關的過程和函數,它有包規范和包體兩部分組成。包規范用于定義公用的常量、變量、過程和函數,建立包規范可以使用CREATE PACKAGE命令
在SQL*PLUS或者PL/SQL工具的命令行下創建包規范示例如下:
CREATE PACKAGE emp_pkg IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER);
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER;
END;
/
包規范只包含了過程和函數的說明,而沒有過程和函數的實現代碼。包體用于實現包規范中的過程和函數,在SQL*PLUS中建立包體可以使用CREATE PACKAGE BODY命令。示例如下:
CREATE PACKAGE BODY emp_pkg IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal=newsal
WHERE lower(ename)=lower(name);
END;
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER
IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comm,0) INTO annual_salary
FROM emp WHERE lower(ename)=lower(name);
RETURN annual_salary;
END;
END;
/
當調用包的過程和函數時,在過程和函數名之前必須要帶有包名作為前綴(包名.子程序名),而如果要訪問其他方案的包,還必須加方案名作為前綴(方案名.包名.子程序)。示例如下:
SQL> call emp_pkg.update_sal('scott',1500);Method called
SQL> VAR income NUMBER
SQL> CALL emp_pkg.annual_income('scott') INTO:income;
Method called
income
---------
18000