|Previous||Table of Contents||Next|
A package is a group of procedures, functions, and variables, often grouped together because they accomplish related tasks. In PL/SQL, packages consist of two parts: the package specification, or package spec, and the package body.
The package spec can be clearly illustrated by using a form-based analogy. When a form displays on your terminal, certain buttons are displayed as well. The code behind each button is a call to a procedure or function. Figure 6.1 illustrates this model within the context of a package.
Figure 6.1 The package model.
Simply put, a package spec defines how other objects within an Oracle database interact with the package. The package spec contains the following types of definitions:
Every construct and object defined within a package spec is public and can be referenced by any block of PL/SQL code. Objects within a package body that are not defined within the package spec are private objects and can be referenced only by objects within the package.
The package spec can contain definitions for variables, constants, datatypes, and user-defined exceptions that can be referenced by the package spec and body, as well as by outside objects. Listing 6.1 illustrates the definition of these constructs.
Listing 6.1 The definition of global constructs in a package spec.
PACKAGE System_Errors IS TYPE MessageParts_type IS TABLE OF varchar2 (20) INDEX BY binary_integer; vLastError varchar2 (100); THIS_PACKAGE CONSTANT varchar2 (13) := 'System_Errors'; xUNHANDLED_ERROR EXCEPTION; FUNCTION Build_Message (vObjectName IN varchar2, iErrorCode IN integer, vErrorString IN varchar2); PROCEDURE Log_Error (vObjectName IN varchar2, vErrorString IN varchar2, vErrorData IN varchar2, iErrorCode IN integer); END System_Errors;
Each of the highlighted constructs can be referenced by all the procedures and functions contained within the package body. Objects outside the package can also reference the constructs by prefacing the name of the construct with the name of the package, as shown in Listing 6.2.
Listing 6.2 Referencing an object within a package.
PROCEDURE Local_Error_Log (vObjectName IN varchar2, iErrorCode IN integer, vErrorString IN varchar2) IS vMessageParts System_Errors.MessageParts_type; BEGIN System_Errors.Build_Message (vObjectName => vObjectName, iErrorCode => iErrorCode, vErrorString => vErrorString); END Local_Error_Log;
Each construct is specific to the user who references it. For example, user A initializes vLastError to Student does not exist and user B initializes vLastError to Attempted division by zero. Neither user is overwriting the value of the other users variable.
The Bodyless Package
Large systems often have a number of definitions that need to be standardized throughout the system. You can define a package spec that contains these definitions and reference the package spec from any object. Although packages are usually defined using both a spec and a body, Oracle doesnt require every package spec to have an associated package body. Consider this package spec:PACKAGE Globals IS FIELD_DELIMITER CONSTANT varchar2 (1) := chr (29); ROW_DELIMITER CONSTANT varchar2 (1) := chr (30); MAX_LENGTH CONSTANT integer := 255; TYPE Student_rec_TYPE IS RECORD (first_name varchar2 (20), last_name varchar2 (20), middle_initial varchar2 (1), ssn varchar2 (9)); TYPE SubStrings_tab_TYPE IS TABLE OF varchar2 (20) INDEX BY binary_integer; END Globals;
Any stored PL/SQL object can reference any of the constants or datatypes defined in the Globals package spec. Since the package doesnt contain any actual procedures or functions, theres no need to define a package body that corresponds to the spec.
|Previous||Table of Contents||Next|