0% found this document useful (0 votes)
18 views21 pages

09 - 3 - Creating Packages

Uploaded by

Mohamed Ramadan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
18 views21 pages

09 - 3 - Creating Packages

Uploaded by

Mohamed Ramadan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 21

4

Creating Packages

Copyright © 2009, Oracle. All rights reserved.


Objectives

After completing this lesson, you should be able to do the


following:
• Describe packages and list their components
• Create a package to group together related variables,
cursors, constants, exceptions, procedures, and functions
• Designate a package construct as either public or private
• Invoke a package construct
• Describe the use of a bodiless package

4-2 Copyright © 2009, Oracle. All rights reserved.


Lesson Agenda

• Identifying the benefits and the components of packages


• Working with packages:
– Creating the package specification and body
– Invoking the package subprograms
– Removing a package
– Displaying the package information

4-3 Copyright © 2009, Oracle. All rights reserved.


What Are PL/SQL Packages?

• A package is a schema object that groups logically related


PL/SQL types, variables, and subprograms.
• Packages usually have two parts:
– A specification (spec)
– A body
• The specification is the interface to the package. It
declares the types, variables, constants, exceptions,
cursors, and subprograms that can be referenced from
outside the package.
• The body defines the queries for the cursors and the code
for the subprograms.
• Enable the Oracle server to read multiple objects into
memory at once.

4-4 Copyright © 2009, Oracle. All rights reserved.


Advantages of Using Packages

• Modularity: Encapsulating related constructs


• Easier maintenance: Keeping logically related functionality
together
• Easier application design: Coding and compiling the
specification and body separately
• Hiding information:
– Only the declarations in the package specification are visible
and accessible to applications
– Private constructs in the package body are hidden and
inaccessible
– All coding is hidden in the package body

4-5 Copyright © 2009, Oracle. All rights reserved.


Advantages of Using Packages

• Added functionality: Persistency of public variables and


cursors
• Better performance:
– The entire package is loaded into memory when the
package is first referenced.
– There is only one copy in memory for all users.
– The dependency hierarchy is simplified.
• Overloading: Multiple subprograms of the same name

4-6 Copyright © 2009, Oracle. All rights reserved.


Components of a PL/SQL Package

Package
specification variable
Public
Procedure A declaration;

variable

Procedure B definition …

Procedure A definition Private


variable
Package BEGIN
body …
END;

4-7 Copyright © 2009, Oracle. All rights reserved.


The Visibility of a Package’s Components

Package
specification public_var

Procedure A;
External
code
private_var
Procedure B IS
BEGIN … END;
Procedure A IS
local_var
Package BEGIN
body …
END;

4-8 Copyright © 2009, Oracle. All rights reserved.


Developing PL/SQL Packages: Overview

View errors/warnings
in SQL Developer

YES
Use SHOW ERRORS
command in SQL*Plus
Create/edit Compiler View compiler
package body warnings/errors? warnings/errors
and spec
NO

Use USER/ALL/DBA_
ERRORS views

Invoke package
subprograms

4-9 Copyright © 2009, Oracle. All rights reserved.


Lesson Agenda

• Identifying the benefits and the components of packages


• Working with packages:
– Creating the package specification and body
– Invoking the package subprograms
– Removing a package
– Displaying the package information

4 - 10 Copyright © 2009, Oracle. All rights reserved.


Creating the Package Specification:
Using the CREATE PACKAGE Statement

CREATE [OR REPLACE] PACKAGE package_name IS|AS


public type and variable declarations
subprogram specifications
END [package_name];

• The OR REPLACE option drops and re-creates the package


specification.
• Variables declared in the package specification are
initialized to NULL by default.
• All the constructs declared in a package specification are
visible to users who are granted privileges on the package.

4 - 11 Copyright © 2009, Oracle. All rights reserved.


Creating the Package Specification:
Using SQL Developer

3
1
2

4 - 12 Copyright © 2009, Oracle. All rights reserved.


Creating the Package Body:
Using SQL Developer
4

1
2

4 - 13 Copyright © 2009, Oracle. All rights reserved.


Example of a Package Specification: comm_pkg

-- The package spec with a public variable and a


-- public procedure that are accessible from
-- outside the package.

CREATE OR REPLACE PACKAGE comm_pkg IS


v_std_comm NUMBER := 0.10; --initialized to 0.10
PROCEDURE reset_comm(p_new_comm NUMBER);
END comm_pkg;
/

• V_STD_COMM is a public global variable initialized to


0.10.
• RESET_COMM is a public procedure used to reset the
standard commission based on some business rules.
It is implemented in the package body.

4 - 14 Copyright © 2009, Oracle. All rights reserved.


Creating the Package Body

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS


private type and variable declarations
subprogram bodies
[BEGIN initialization statements]
END [package_name];

• The OR REPLACE option drops and re-creates the


package body.
• Identifiers defined in the package body are private and
not visible outside the package body.
• All private constructs must be declared before they are
referenced.
• Public constructs are visible to the package body.

4 - 15 Copyright © 2009, Oracle. All rights reserved.


Example of a Package Body: comm_pkg

CREATE OR REPLACE PACKAGE BODY comm_pkg IS


FUNCTION validate(p_comm NUMBER) RETURN BOOLEAN IS
v_max_comm employees.commission_pct%type;
BEGIN
SELECT MAX(commission_pct) INTO v_max_comm
FROM employees;
RETURN (p_comm BETWEEN 0.0 AND v_max_comm);
END validate;

PROCEDURE reset_comm (p_new_comm NUMBER) IS BEGIN


IF validate(p_new_comm) THEN
v_std_comm := p_new_comm; -- reset public var
ELSE RAISE_APPLICATION_ERROR(
-20210, 'Bad Commission');
END IF;
END reset_comm;
END comm_pkg;

4 - 16 Copyright © 2009, Oracle. All rights reserved.


Invoking the Package Subprograms: Examples

-- Invoke a function within the same packages:


CREATE OR REPLACE PACKAGE BODY comm_pkg IS ...
PROCEDURE reset_comm(p_new_comm NUMBER) IS
BEGIN
IF validate(p_new_comm) THEN
v_std_comm := p_new_comm;
ELSE ...
END IF;
END reset_comm;
END comm_pkg;

-- Invoke a package procedure from SQL*Plus:


EXECUTE comm_pkg.reset_comm(0.15)

-- Invoke a package procedure in a different schema:


EXECUTE scott.comm_pkg.reset_comm(0.15)

4 - 17 Copyright © 2009, Oracle. All rights reserved.


Invoking the Package Subprograms:
Using SQL Developer

4 - 18 Copyright © 2009, Oracle. All rights reserved.


Creating and Using Bodiless Packages

CREATE OR REPLACE PACKAGE global_consts IS


c_mile_2_kilo CONSTANT NUMBER := 1.6093;
c_kilo_2_mile CONSTANT NUMBER := 0.6214;
c_yard_2_meter CONSTANT NUMBER := 0.9144;
c_meter_2_yard CONSTANT NUMBER := 1.0936;
END global_consts;

BEGIN DBMS_OUTPUT.PUT_LINE('20 miles = ' ||


20 * global_consts.c_mile_2_kilo || ' km');
END;

CREATE FUNCTION mtr2yrd(p_m NUMBER) RETURN NUMBER IS


BEGIN
RETURN (p_m * global_consts.c_meter_2_yard);
END mtr2yrd;
/
EXECUTE DBMS_OUTPUT.PUT_LINE(mtr2yrd(1))

4 - 19 Copyright © 2009, Oracle. All rights reserved.


Removing Packages: Using SQL Developer
or the SQL DROP Statement
Drop package specification and body Drop package body only

-- Remove the package specification and body


DROP PACKAGE package_name;

-- Remove the package body only


DROP PACKAGE BODY package_name;

4 - 20 Copyright © 2009, Oracle. All rights reserved.


Viewing Packages Using the Data Dictionary

-- View the package specification.


SELECT text
FROM user_source
WHERE name = 'COMM_PKG' AND type = 'PACKAGE';

-- View the package body.


SELECT text
FROM user_source
WHERE name = 'COMM_PKG' AND type = 'PACKAGE BODY';

4 - 21 Copyright © 2009, Oracle. All rights reserved.

You might also like