Features
A
Package is a PL/SQL construct that allows related objects to be stored together
A
Package is a stored database object
Groups
together PROCEDURES, FUNCTIONS, CURSORS, types and variables
Other
PL/SQL blocks can reference packages
Package
Creation
Package
has two components:
Package Specification
Package body         
Package
Specification:
Declares
types, variables, constants, exceptions, cursors and subprograms available for
use Constructs declared in the package specifications are public
    
Syntax:
          CREATE  OR REPLACE 
PACKAGE  package_name IS
          procedure_specification
          function_specification
                    variable_declaration
          cursor_declaration etc.
           END 
package_name;
Package
Body:
It
defines cursors and subprograms and so implements the specification
It
can not be successfully compiled unless the package specification has already
been successfully compiled
Syntax:
          CREATE  OR REPLACE 
PACKAGE  BODY  package_name IS
           private_variable
          procedure_definition
          function_definition etc.
          private function or procedure
definition
          END package_name;
Access
Rules for Package Members
Data
members and methods that are declared within the package specification become
public members of the package
Data
members and methods that are not declared within the package specification, but
are implemented in the package body, become private to the package
Public
package members can be accessed by the methods belonging to the package as well
as by methods outside the package
Private
package members can be accessed only by the methods defined in the package
itself
Data
members of a package (variables, constants, cursors etc.), both public and
private, act like global data members and persist within a single Oracle
session or connection.
When
a packaged subprogram opens a cursor, that cursor remains open and is available
to other packaged methods throughout the session. You do not have to explicitly
define the cursor in each method. You can open it in one module and fetch it in
another module.
Packages
– Advantages
      Advantages of Packages
Modularity:
encapsulates logically related programming structures in a named module
Easier Application Design:
initially only the interface information in the package specification is
required
Information hiding:
constructs can be public or private
Better Performance:
when a packaged subprogram is called the first time, the entire package is
loaded into memory
Overloading:
packages allow you to overload procedures and functions
Packages:
Example
Creating
a Package Specification
CREATE OR REPLACE PACKAGE emp_pack
IS
--Two procedures added to the specification become global objects
   PROCEDURE emp_add (
      p_empno   
IN   emp.empno%TYPE,
      p_ename    IN   emp.ename%TYPE,
      p_esal     IN   emp.sal%TYPE,
      p_deptno   IN   emp.deptno%TYPE
   );
   PROCEDURE emp_del (p_empno IN emp.empno%TYPE);
END emp_pack;
 Creating
a Package Body 
CREATE OR REPLACE PACKAGE BODY emp_pack
IS
-- Private function with deptno as parameter to check the existence of
deptno value in dept table
   FUNCTION valid_deptno (p_deptno dept.deptno%TYPE)
      RETURN BOOLEAN
   IS
      dummy   NUMBER (2);
   BEGIN
      SELECT deptno
        INTO dummy
        FROM dept
       WHERE deptno = p_deptno;
      RETURN TRUE;
--Exception Handling if the deptno value is not found
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN FALSE;
   END valid_deptno;                           
--
End of the private function
--Implementing the procedure defined in the specification
   PROCEDURE emp_add (
      p_empno    IN   emp.empno%TYPE,
      p_ename    IN   emp.ename%TYPE,
      p_esal     IN   emp.sal%TYPE,
      p_deptno   IN   emp.deptno%TYPE
   )
   IS
   BEGIN
--Function valid_deptno is called by procedure emp_add
      IF valid_deptno (p_deptno)
      THEN
         INSERT INTO emp
                     (empno, ename, sal, deptno
                     )
              VALUES (p_empno, p_ename, p_esal, p_deptno
                     );
         DBMS_OUTPUT.put_line
            (   'Emp# : '
             || p_empno
             || ' added to                                                                         
table'
            );
         COMMIT;
      ELSE
         raise_application_error
                          (-20010,
                           'Invalid 
                  department…Try
again'
                          );
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line
(SQLERRM);
   END emp_add;                                 -- End of the public
procedure
--Implementing the procedure defined in the specification
   PROCEDURE emp_del (p_empno IN emp.empno%TYPE)
   IS
   BEGIN
      DELETE FROM emp
            WHERE empno = p_empno;
      IF SQL%NOTFOUND
      THEN
         raise_application_error (-20120, 'Employee does not exist');
      ELSE
         DBMS_OUTPUT.put_line
(SQL%ROWCOUNT || ' ROWS DELETED');
      END IF;
   END emp_del;                                 -- End of the public
procedure
END
emp_pack;                                   -- End of Package
Invoking a packaged
procedure or function from SQL*Plus
          EXECUTE  emp_pack.emp_del(1001) 
Concept
of Global Variable in a Package
PL/SQL
packages offer the ability to implement global data in your application
environment.
If
you have access to the package, you can modify package variables in one method
and then reference those changed variables in another method. The values of
packaged data members persist for the duration of a user session (connection to
the database).
Package
variables can carry data across the boundaries of transactions, since they are
tied to the session itself and not to a transaction.
Packages:
Use of Global Variable
      Package Specification
          The variable v_sal is a packaged
public variable that can act as a global variable for the package members as
well as outside methods, that have right to execute the package
CREATE OR REPLACE PACKAGE increment_pack
IS
   -- Global Variable declared
inside the specification
   v_sal   emp.sal%TYPE;
   PROCEDURE show_increment (p_empno emp.empno%TYPE);
END increment_pack;
Package
Body
CREATE OR REPLACE PACKAGE BODY increment_pack
IS
   --Private procedure
   PROCEDURE emp_sal (v_eno IN emp.empno%TYPE)
   IS
   BEGIN
      SELECT sal
        INTO v_sal
        FROM emp
       WHERE empno = v_eno;
   END emp_sal;
   -- End of the private
procedure within the package
   PROCEDURE show_increment (p_empno emp.empno%TYPE)
   IS
   BEGIN
      emp_sal (p_empno);                     -- Call to the private
procedure
      -- Value of the variable
v_sal is set by the procedure emp_sal and is used here
      IF v_sal > 2000
      THEN
         DBMS_OUTPUT.put_line
('no salary increase');
      ELSE
         UPDATE emp
            SET sal = sal + sal * .1
          WHERE empno = p_empno;
         DBMS_OUTPUT.put_line
('salary increased');
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         DBMS_OUTPUT.put_line
('Wrong employee number');
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line
(SQLERRM);
   END show_increment;
END increment_pack;
-- Call 1
BEGIN
                   increment_pack.show_increment(5678);
END;
/--
Wrong employee number
-- call 2
 BEGIN
                   increment_pack.show_increment(7369);
 END;
/
-- ORA-06502: PL/SQL: numeric or value error: number precision too large
-- call 3
BEGIN
   increment_pack.show_increment (7521);
END;
-- salary increased
Packages:
Forward Declarations
Identifiers must be
declared before referencing them
CREATE
OR REPLACE PACKAGE BODY forward_pack
IS
          PROCEDURE award_bonus (. . .)
          IS
          BEGIN
              calc_rating(. . .);--illegal
reference
          END;
          FUNCTION calc_rating ( . . . )
          RETURN NUMBER
          IS
          BEGIN
                   RETURN …;
          END;
END
forward_pack;
CREATE
OR REPLACE PACKAGE BODY forward_pack
IS
          -- Forward declaration
          FUNCTION calc_rating(. . .) RETURN
NUMBER;     
          PROCEDURE award_bonus (. . .)
          IS
          BEGIN
              calc_rating(. . .);-- Legal reference
          END;
          FUNCTION calc_rating ( . . . )
          RETURN NUMBER
          IS
          BEGIN
                   RETURN …;
          END;
END
forward_pack;
Packages
– Overloading
Allows you to use the
same name for different subprograms inside a package
Requires formal
parameters of the subprogram to differ in number, order or data type family
For functions if only the
return type is different but parameters are same then overloading is not
permitted
CREATE
OR REPLACE PACKAGE PACK_MARKETING AS
PROCEDURE
MKT_PROJECTION;
PROCEDURE
MKT_PROJECTION(MK_ID NUMBER);
PROCEDURE
MKT_PROJECTION (MK_NAME VARCHAR2);
PROCEDURE
MKT_PROJECTION(MK_ID NUMBER,MK_NAME
                              VARCHAR2);
PROCEDURE
MKT_PROJECTION(MK_NAME VARCHAR2,
                         MK_ID NUMBER);
END
PACK_MARKETING;
Overloading:
Example
CREATE OR REPLACE PACKAGE overloadpack
AS
   PROCEDURE increasesal (eno emp.empno%TYPE);
   PROCEDURE increasesal (ename emp.ename%TYPE);
END
overloadpack;
/
CREATE OR REPLACE PACKAGE BODY overloadpack
AS
   PROCEDURE increasesal (eno emp.empno%TYPE)
   AS
   BEGIN
      UPDATE emp
         SET sal = sal + 1000
       WHERE empno = eno;
      IF SQL%NOTFOUND
      THEN
         DBMS_OUTPUT.put_line
('Wrong employee                    number');
      END IF;
   END increasesal;
   PROCEDURE increasesal (ename emp.ename%TYPE)
   AS
      cnt   NUMBER;
      CURSOR empcur
      IS
         SELECT empno
           FROM emp
          WHERE ename = increasesal.ename;
   BEGIN
      SELECT COUNT (empno)
        INTO cnt
        FROM emp
       WHERE ename = increasesal.ename;
      IF cnt = 0
      THEN
         DBMS_OUTPUT.put_line
('Wrong employee name');
      ELSE
         FOR eno IN empcur
         LOOP
            UPDATE emp
               SET sal = sal + 1000
             WHERE empno = eno.empno;
         END LOOP;
      END IF;
   END increasesal;
END overloadpack;
Dropping
and Recompiling a Package
 Alter package
    ALTER PACKAGE package_name COMPILE;
 Dropping package specification
    DROP PACKAGE package_name;
 Dropping
package body
    DROP PACKAGE BODY package_name;
Data
Dictionary Views
           The data dictionary views used for
stand-alone procedures and functions are also available for packaged procedures
and functions          
              USER_SOURCE Is used to obtain the text of a stored object in the
users schema
              USER_OBJECTS Is used to display the list of all objects in the
users schema
              USER_PROCEDURES
Is used to display the list of all procedures and functions in that users
schema
 
 
No comments:
Post a Comment