Oracle PL/SQL/PL SQL/Package

Материал из SQL эксперт
Перейти к: навигация, поиск

A package with one method

   <source lang="sql">
   

SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE PersistPkg AS

 2    PRAGMA SERIALLY_REUSABLE;
 3
 4    TYPE t_StudentTable IS TABLE OF lecturer.ID%TYPE
 5      INDEX BY BINARY_INTEGER;
 6
 7    v_MaxRows NUMBER := 5;
 8
 9    PROCEDURE Readlecturer(p_StudTable OUT t_StudentTable,
10                           p_NumRows   OUT NUMBER);
11  END PersistPkg;
12  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY PersistPkg AS

 2    PRAGMA SERIALLY_REUSABLE;
 3    CURSOR StudentCursor IS
 4      SELECT ID
 5        FROM lecturer
 6        ORDER BY last_name;
 7
 8    PROCEDURE Readlecturer(p_StudTable OUT t_StudentTable,
 9                           p_NumRows   OUT NUMBER) IS
10      v_Done BOOLEAN := FALSE;
11      v_NumRows NUMBER := 1;
12    BEGIN
13      IF NOT StudentCursor%ISOPEN THEN
14        OPEN StudentCursor;
15      END IF;
16
17      WHILE NOT v_Done LOOP
18        FETCH StudentCursor INTO p_StudTable(v_NumRows);
19        IF StudentCursor%NOTFOUND THEN
20          CLOSE StudentCursor;
21          v_Done := TRUE;
22        ELSE
23          v_NumRows := v_NumRows + 1;
24          IF v_NumRows > v_MaxRows THEN
25            v_Done := TRUE;
26          END IF;
27        END IF;
28      END LOOP;
29
30      p_NumRows := v_NumRows - 1;
31
32    END Readlecturer;
33  END PersistPkg;
34  /

Package body created. SQL> SQL> drop table lecturer; Table dropped.


 </source>
   
  


A PL/SQL package with two methods

   <source lang="sql">
   

SQL> SQL> CREATE TABLE place (

 2    room_id          NUMBER(5) PRIMARY KEY,
 3    building         VARCHAR2(15),
 4    room_number      NUMBER(4),
 5    number_seats     NUMBER(4),
 6    description      VARCHAR2(50)
 7    );

Table created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20001, "Building 7", 201, 1000, "Large Lecture Hall");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20002, "Building 6", 101, 500, "Small Lecture Hall");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20003, "Building 6", 150, 50, "Discussion Room A");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20004, "Building 6", 160, 50, "Discussion Room B");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats,description)

 2             VALUES (20005, "Building 6", 170, 50, "Discussion Room C");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20006, "Music Building", 100, 10, "Music Practice Room");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20007, "Music Building", 200, 1000, "Concert Room");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20008, "Building 7", 300, 75, "Discussion Room D");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats,description)

 2             VALUES (20009, "Building 7", 310, 50, "Discussion Room E");

1 row created. SQL> SQL> SQL> SQL> CREATE OR REPLACE PACKAGE RoomsPkg AS

 2    PROCEDURE NewRoom(p_Building place.building%TYPE,
 3                      p_RoomNum place.room_number%TYPE,
 4                      p_NumSeats place.number_seats%TYPE,
 5                      p_Description place.description%TYPE);
 6
 7    PROCEDURE DeleteRoom(p_RoomID IN place.room_id%TYPE);
 8  END RoomsPkg;
 9  /

Package created. SQL> show errors No errors. SQL> SQL> CREATE OR REPLACE PACKAGE BODY RoomsPkg AS

 2    PROCEDURE NewRoom(p_Building place.building%TYPE,
 3                      p_RoomNum place.room_number%TYPE,
 4                      p_NumSeats place.number_seats%TYPE,
 5                      p_Description place.description%TYPE) IS
 6    BEGIN
 7      INSERT INTO place
 8        (room_id, building, room_number, number_seats, description)
 9        VALUES
10        (1100, p_Building, p_RoomNum, p_NumSeats,
11         p_Description);
12    END NewRoom;
13
14    PROCEDURE DeleteRoom(p_RoomID IN place.room_id%TYPE) IS
15    BEGIN
16      DELETE FROM place
17        WHERE room_id = p_RoomID;
18    END DeleteRoom;
19  END RoomsPkg;
20  /

Package body created. SQL> show errors No errors. SQL> SQL> SQL> drop table place; Table dropped. SQL> SQL>


 </source>
   
  


call utitilities package

   <source lang="sql">
   

SQL> SQL> create or replace

 2    package utilities as
 3      procedure swap( p_parm1 in out number,
 4                      p_parm2 in out number );
 5      procedure swap( p_parm1 in out varchar2,
 6                      p_parm2 in out varchar2 );
 7      procedure swap( p_parm1 in out date,
 8                      p_parm2 in out date );
 9    end utilities;
10  /

Package created. SQL> SQL> create or replace

 2    package body utilities as
 3
 4      procedure swap( p_parm1 in out number,
 5                 p_parm2 in out number ) is
 6        l_temp number;
 7      begin
 8        dbms_output.put_line( "Swapping number" );
 9        l_temp := p_parm1;
10        p_parm1 := p_parm2;
11        p_parm2 := l_temp;
12      end swap;
13
14      procedure swap( p_parm1 in out varchar2,
15                      p_parm2 in out varchar2 ) is
16        l_temp varchar2(32767);
17      begin
18        dbms_output.put_line( "Swapping varchar2" );
19        l_temp := p_parm1;
20        p_parm1 := p_parm2;
21        p_parm2 := l_temp;
22      end swap;
23
24      procedure swap( p_parm1 in out date,
25                      p_parm2 in out date ) is
26        l_temp date;
27      begin
28        dbms_output.put_line( "Swapping date" );
29        l_temp := p_parm1;
30        p_parm1 := p_parm2;
31        p_parm2 := l_temp;
32      end swap;
33
34    end utilities;
35    /

Package body created. SQL> SQL> SQL> declare

 2      l_num1 number := 1;
 3      l_num2 number := 2;
 4      l_date1 date := sysdate;
 5      l_date2 date := sysdate + 1;
 6    begin
 7      utilities.swap( l_num1, l_num2 );
 8      dbms_output.put_line( "l_num1 = " || l_num1 );
 9      dbms_output.put_line( "l_num2 = " || l_num2 );
10      utilities.swap( l_date1, l_date2 );
11      dbms_output.put_line( "l_date1 = " || l_date1 );
12      dbms_output.put_line( "l_date2 = " || l_date2 );
13    end;
14    /

Swapping number l_num1 = 2 l_num2 = 1 Swapping date l_date1 = 12-JUN-08 l_date2 = 11-JUN-08 PL/SQL procedure successfully completed. SQL>


 </source>
   
  


Counter package

   <source lang="sql">
   

SQL> SQL> SQL> SQL> create or replace package counter is

 2   procedure reset;
 3   procedure inc;
 4   procedure show;
 5   end;
 6  /

Package created. SQL> create or replace package body counter is

 2       cnt pls_integer := 0;
 3       procedure reset is
 4       begin
 5           cnt := 0;
 6       end;
 7
 8       procedure inc is
 9       begin
10          cnt := cnt + 1;
11       end;
12
13       procedure show is
14       begin
15           dbms_output.put_line("Execution Count: "||cnt);
16       end;
17   end;
18  /

Package body created. SQL> SQL>



 </source>
   
  


Create a package declaration and create its body after

   <source lang="sql">
   

SQL> SQL> SQL> create or replace

 2    package shield as
 3      procedure foo;
 4    end shield;
 5  /

Package created. SQL> SQL> create or replace

 2    package body shield as
 3      procedure foo is
 4        l_n number;
 5      begin
 6        null;
 7      end foo;
 8    end;
 9    /

Package body created. SQL> SQL> show errors; No errors.


 </source>
   
  


Create a package level variable

   <source lang="sql">
   

SQL> SQL> create or replace

 2    package variables as
 3      g_public_number number := null;
 4      procedure setPrivateNumber( p_num number );
 5      procedure print_private_number;
 6    end variables;
 7    /

Package created. SQL> SQL> create or replace

 2    package body variables as
 3      myNumber number := null;
 4
 5      procedure setPrivateNumber( p_num number ) is
 6      begin
 7        myNumber := p_num;
 8      end setPrivateNumber;
 9
10      procedure print_private_number is
11      begin
12        dbms_output.put_line( nvl(to_char(myNumber),"null" ) );
13      end print_private_number;
14
15    end variables;
16    /

Package body created. SQL>


 </source>
   
  


Create package and member cursor

   <source lang="sql">
   

SQL> SQL> SQL> CREATE TABLE gifts (

 2    gift_id             INTEGER          CONSTRAINT gifts_pk PRIMARY KEY,
 3    gift_type_id        INTEGER          ,
 4    name                   VARCHAR2(30)     NOT NULL,
 5    description            VARCHAR2(50),
 6    price                  NUMBER(5, 2)
 7  );

Table created. SQL> SQL> SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (1, 1, "Flower", "Birthday", 19.95); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (2, 1, "Computer", "New Year", 30.00); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (3, 2, "iPod", "Birthday", 25.99); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (4, 2, "iPhone", "New Year", 13.95); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (5, 2, "Book", "Birthday", 49.99); 1 row created. SQL> SQL> CREATE OR REPLACE PACKAGE gift_package AS

 2    TYPE t_ref_cursor IS REF CURSOR;
 3    FUNCTION get_gifts_ref_cursor RETURN t_ref_cursor;
 4    PROCEDURE updatePrice (p_gift_id IN gifts.gift_id%TYPE,p_factor IN NUMBER);
 5  END gift_package;
 6  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY gift_package AS

 2    FUNCTION get_gifts_ref_cursor
 3    RETURN t_ref_cursor IS
 4      gifts_ref_cursor t_ref_cursor;
 5    BEGIN
 6      OPEN gifts_ref_cursor FOR SELECT gift_id, name, price FROM gifts;
 7
 8      RETURN gifts_ref_cursor;
 9    END get_gifts_ref_cursor;
10
11    PROCEDURE updatePrice(p_gift_id IN gifts.gift_id%TYPE,p_factor IN NUMBER) AS
12      v_gift_count INTEGER;
13    BEGIN
14      SELECT COUNT(*)INTO v_gift_count FROM gifts WHERE gift_id = p_gift_id;
15      IF v_gift_count = 1 THEN
16        UPDATE gifts
17        SET price = price * p_factor
18        WHERE gift_id = p_gift_id;
19        COMMIT;
20      END IF;
21    EXCEPTION
22      WHEN OTHERS THEN
23        ROLLBACK;
24    END updatePrice;
25  END gift_package;
26  /

Package body created. SQL> SQL> drop table gifts; Table dropped.



 </source>
   
  


Crosss reference between two packages

   <source lang="sql">
   

SQL> SQL> create or replace package myPackage

 2  as
 3    PROCEDURE P1;
 4    PROCEDURE P2;
 5    PROCEDURE P3;
 6    FUNCTION F1 return number;
 7    FUNCTION F2 return number;
 8  end;
 9  /

Package created. SQL> SQL> create or replace package myPackage2

 2  as
 3    PROCEDURE P3;
 4    PROCEDURE P4;
 5    PROCEDURE P5;
 6    FUNCTION F1 return number;
 7    FUNCTION F3 return number;
 8  end;
 9  /

Package created. SQL> SQL> create or replace package body myPackage2

 2  as
 3    PROCEDURE P3
 4    as
 5      begin
 6        myPackage.P3;
 7      end;
 8
 9    FUNCTION F1 return number
10    as
11      begin
12        return myPackage.F1;
13      end;
14
15    PROCEDURE P4
16    as
17      begin
18        null;
19      end;
20
21    PROCEDURE P5
22    as
23      begin
24        null;
25      end;
26
27    FUNCTION F3 return number
28    as
29      begin
30        return 1;
31      end;
32  end;
33  /

Package body created. SQL> SQL> create or replace package body myPackage

 2  as
 3    PROCEDURE P1
 4    as
 5      begin
 6        null;
 7      end;
 8
 9    PROCEDURE P2
10    as
11      begin
12        null;
13      end;
14
15    PROCEDURE P3
16    as
17      begin
18        null;
19      end;
20
21    FUNCTION F1 return number
22    as
23      begin
24        return 1;
25      end;
26
27    FUNCTION F2 return number
28    as
29      begin
30        return 1;
31      end;
32  end;
33  /

Package body created. SQL> SQL>



 </source>
   
  


Cursor operation between package functions

   <source lang="sql">
   

SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> SQL> SQL> CREATE OR REPLACE PACKAGE StudentFetch AS

 2    TYPE t_lecturer IS TABLE OF lecturer%ROWTYPE
 3      INDEX BY BINARY_INTEGER;
 4    PROCEDURE OpenCursor;
 5    PROCEDURE CloseCursor;
 6    FUNCTION FetchRows(p_BatchSize IN OUT NUMBER,p_lecturer OUT t_lecturer)
 7      RETURN BOOLEAN;
 8    PROCEDURE PrintRows(p_BatchSize IN NUMBER,
 9                        p_lecturer IN t_lecturer);
10  END StudentFetch;
11  /

Package created. SQL> show errors No errors. SQL> SQL> CREATE OR REPLACE PACKAGE BODY StudentFetch AS

 2    CURSOR myAllLecturer IS
 3      SELECT *
 4        FROM lecturer
 5        ORDER BY ID;
 6
 7    PROCEDURE OpenCursor IS
 8    BEGIN
 9      OPEN myAllLecturer;
10    END OpenCursor;
11
12    PROCEDURE CloseCursor IS
13    BEGIN
14      CLOSE myAllLecturer;
15    END CloseCursor;
16
17    FUNCTION FetchRows(p_BatchSize IN OUT NUMBER,
18                       p_lecturer OUT t_lecturer)
19      RETURN BOOLEAN IS
20      v_Finished BOOLEAN := TRUE;
21    BEGIN
22      FOR v_Count IN 1..p_BatchSize LOOP
23        FETCH myAllLecturer INTO p_lecturer(v_Count);
24        IF myAllLecturer%NOTFOUND THEN
25          v_Finished := FALSE;
26          p_BatchSize := v_Count - 1;
27          EXIT;
28        END IF;
29      END LOOP;
30      RETURN v_Finished;
31    END FetchRows;
32
33    PROCEDURE PrintRows(p_BatchSize IN NUMBER,
34                        p_lecturer IN t_lecturer) IS
35    BEGIN
36      FOR v_Count IN 1..p_BatchSize LOOP
37        DBMS_OUTPUT.PUT("ID: " || p_lecturer(v_Count).ID);
38        DBMS_OUTPUT.PUT(" Name: " || p_lecturer(v_Count).first_name);
39        DBMS_OUTPUT.PUT_LINE(" " || p_lecturer(v_Count).last_name);
40      END LOOP;
41    END PrintRows;
42  END StudentFetch;
43  /

Package body created. SQL> show errors No errors. SQL> SQL> SQL> SQL> drop table lecturer; Table dropped. SQL>


 </source>
   
  


dependencies between an anonymous calling block and package runtime state.

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE SimplePkg AS

 2    v_GlobalVar NUMBER := 1;
 3    PROCEDURE UpdateVar;
 4  END SimplePkg;
 5  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY SimplePkg AS

 2    PROCEDURE UpdateVar IS
 3    BEGIN
 4      v_GlobalVar := 7;
 5    END UpdateVar;
 6  END SimplePkg;
 7  /

Package body created. SQL> SQL>


 </source>
   
  


Global definition

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE global_def IS

 2     pv_execution_num PLS_INTEGER := 0;
 3     PROCEDURE increment_value (p_increment_num PLS_INTEGER);
 4  END global_def;
 5  /

Package created. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE BODY global_def IS

 2     lv_execution_num PLS_INTEGER := 0;
 3     PROCEDURE increment_display (p_value_num PLS_INTEGER)IS
 4     BEGIN
 5        DBMS_OUTPUT.PUT_LINE("Variable Value: " || p_value_num);
 6     END increment_display;
 7     PROCEDURE increment_value (p_increment_num PLS_INTEGER) IS
 8     BEGIN
 9        lv_execution_num := lv_execution_num + p_increment_num;
10        increment_display (lv_execution_num);
11     END increment_value;
12  END global_def;
13  /

Package body created. SQL> SQL> SQL> SQL> BEGIN

 2     global_def.increment_value(5);
 3     global_def.increment_value(3);
 4     global_def.increment_value(1);
 5  END;
 6  /

Variable Value: 14 Variable Value: 17 Variable Value: 18 PL/SQL procedure successfully completed.


 </source>
   
  


Nested package reference

   <source lang="sql">
   

SQL> CREATE TABLE EMP(

 2      EMPNO NUMBER(4) NOT NULL,
 3      ENAME VARCHAR2(10),
 4      JOB VARCHAR2(9),
 5      MGR NUMBER(4),
 6      HIREDATE DATE,
 7      SAL NUMBER(7, 2),
 8      COMM NUMBER(7, 2),
 9      DEPTNO NUMBER(2)
10  );

Table created. SQL> create or replace package myPackage1 is

 2   procedure P1; end;
 3  /

Package created. SQL> create or replace package body myPackage1 is

 2   procedure P1 is
 3   v_cnt number;
 4   begin
 5       select count(*) into v_cnt from emp;
 6   end;
 7   end;
 8  /

Package body created. SQL> create or replace package myPackage2 is procedure P2; end;

 2  /

Package created. SQL> create or replace package body myPackage2 is

 2   procedure P2 is
 3   begin
 4       myPackage1.P1;
 5   end;
 6   end;
 7  /

Package body created. SQL> create or replace package myPackage3 is procedure P3; end;

 2  /

Package created. SQL> create or replace package body myPackage3 is

 2   procedure P3 is
 3   begin
 4       myPackage2.P2;
 5   end;
 6  end;
 7  /

Package body created. SQL> create or replace package myPackage4 is

 2   procedure P4; end;
 3  /

Package created. SQL> create or replace package body myPackage4 is

 2   procedure P4 is
 3   begin
 4       myPackage3.P3;
 5   end;
 6   end;
 7  /

Package body created. SQL> create or replace package body myPackage1 is

 2   procedure P1 is
 3   v_cnt number;
 4   begin
 5       select count(*) into v_cnt from emp where empno > 0;
 6   end;
 7   end;
 8  /

Package body created. SQL> SQL> select object_name, object_type, status

 2   from user_objects
 3   where object_name in ("MYPACKAGE1","MYPACKAGE2","MYPACKAGE3","MYPACKAGE4");

no rows selected SQL> SQL> SQL> drop table emp; Table dropped.



 </source>
   
  


Overloaded packages.

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE Overload AS

 2    FUNCTION TestFunc(p1 IN NUMBER)
 3      RETURN VARCHAR2;
 4    PRAGMA RESTRICT_REFERENCES(TestFunc, WNDS, RNDS, WNPS, RNPS);
 5
 6    FUNCTION TestFunc(pA IN VARCHAR2,pB IN DATE)
 7      RETURN VARCHAR2;
 8    PRAGMA RESTRICT_REFERENCES(TestFunc, WNDS, RNDS, WNPS, RNPS);
 9  END Overload;
10  /

Package created. SQL> show errors No errors. SQL> SQL> CREATE OR REPLACE PACKAGE BODY Overload AS

 2    FUNCTION TestFunc(p1 IN NUMBER)
 3      RETURN VARCHAR2 IS
 4    BEGIN
 5      RETURN "Version 1";
 6    END TestFunc;
 7
 8    FUNCTION TestFunc(pA IN VARCHAR2,pB IN DATE)
 9      RETURN VARCHAR2 IS
10    BEGIN
11      RETURN "Version 2";
12    END TestFunc;
13  END Overload;
14  /

Package body created. SQL> show errors No errors. SQL> SQL> SELECT Overload.TestFunc(1) FROM dual; OVERLOAD.TESTFUNC(1)


Version 1 1 row selected. SQL> SELECT Overload.TestFunc("abc", SYSDATE) FROM dual; OVERLOAD.TESTFUNC("ABC",SYSDAT


Version 2 1 row selected. SQL>



 </source>
   
  


Overloading based on user defined object types.

   <source lang="sql">
   

SQL> CREATE OR REPLACE TYPE myTable1 AS OBJECT (

 2     f NUMBER
 3   );
 4   /

Type created. SQL> SQL> SQL> CREATE OR REPLACE TYPE myTable2 AS OBJECT (

 2     f NUMBER
 3   );
 4   /

Type created. SQL> SQL> SQL> SQL> CREATE OR REPLACE PACKAGE Overload AS

 2     PROCEDURE Proc(p1 IN myTable1);
 3     PROCEDURE Proc(p1 IN myTable2);
 4   END Overload;
 5   /

Package created. SQL> SQL> SQL> SQL> show errors No errors. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE BODY Overload AS

 2     PROCEDURE Proc(p1 IN myTable1) IS
 3     BEGIN
 4       DBMS_OUTPUT.PUT_LINE("Proc(myTable1): " || p1.f);
 5     END Proc;
 6
 7     PROCEDURE Proc(p1 IN myTable2) IS
 8     BEGIN
 9       DBMS_OUTPUT.PUT_LINE("Proc(myTable2): " || p1.f);
10     END Proc;
11   END Overload;
12   /

Package body created. SQL> SQL> show errors No errors. SQL> SQL> SQL> set serveroutput on SQL> DECLARE

 2     v_Obj1 myTable1 := myTable1(1);
 3     v_OBj2 myTable2 := myTable2(2);
 4   BEGIN
 5     Overload.Proc(v_Obj1);
 6     Overload.proc(v_Obj2);
 7   END;
 8   /

Proc(myTable1): 1 Proc(myTable2): 2 PL/SQL procedure successfully completed. SQL> SQL> SQL> SQL> drop type myTable1 force; Type dropped. SQL> SQL> drop type myTable2 force; Type dropped. SQL> SQL> SQL> SQL> SQL>



 </source>
   
  


Overloading Packaged Subprograms

   <source lang="sql">
   

SQL> SQL> SQL> CREATE TABLE myStudent (

 2    student_id NUMBER(5) NOT NULL,
 3    department CHAR(3)   NOT NULL,
 4    course     NUMBER(3) NOT NULL,
 5    grade      CHAR(1)
 6    );

Table created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10000, "CS", 102, "A");

1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10002, "CS", 102, "B");

1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10003, "CS", 102, "C");

1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10000, "HIS", 101, "A");

1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10001, "HIS", 101, "B");

1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10002, "HIS", 101, "B");

1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)

 2                           VALUES (10003, "HIS", 101, "A");

1 row created. SQL> SQL> SQL> SQL> CREATE TABLE session (

 2    department       CHAR(3),
 3    course           NUMBER(3),
 4    description      VARCHAR2(2000),
 5    max_lecturer     NUMBER(3),
 6    current_lecturer NUMBER(3),
 7    num_credits      NUMBER(1),
 8    room_id          NUMBER(5)
 9    );

Table created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 101, "History 101", 30, 11, 4, 20000);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 301, "History 301", 30, 0, 4, 20004);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 101, "Computer Science 101", 50, 0, 4, 20001);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 203, "Economics 203", 15, 0, 3, 20002);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 102, "Computer Science 102", 35, 3, 4, 20003);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 410, "Music 410", 5, 4, 3, 20005);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 101, "Economics 101", 50, 0, 4, 20007);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("NUT", 307, "Nutrition 307", 20, 2, 4, 20008);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 100, "Music 100", 100, 0, 3, NULL);

1 row created. SQL> SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> CREATE OR REPLACE PACKAGE ClassPackage AS

 2    PROCEDURE AddStudent(p_ID  IN lecturer.id%TYPE,
 3                         p_Department IN session.department%TYPE,
 4                         p_Course     IN session.course%TYPE);
 5
 6    PROCEDURE AddStudent(p_FirstName IN lecturer.first_name%TYPE,
 7                         p_LastName  IN lecturer.last_name%TYPE,
 8                         p_Department IN session.department%TYPE,
 9                         p_Course     IN session.course%TYPE);
10
11  END ClassPackage;
12  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY ClassPackage AS

 2    PROCEDURE AddStudent(p_ID  IN lecturer.id%TYPE,
 3                         p_Department IN session.department%TYPE,
 4                         p_Course     IN session.course%TYPE) IS
 5    BEGIN
 6      INSERT INTO myStudent (student_id, department, course)
 7        VALUES (p_ID, p_Department, p_Course);
 8      COMMIT;
 9    END AddStudent;
10
11    PROCEDURE AddStudent(p_FirstName IN lecturer.first_name%TYPE,
12                         p_LastName  IN lecturer.last_name%TYPE,
13                         p_Department IN session.department%TYPE,
14                         p_Course     IN session.course%TYPE) IS
15      myLecturerID lecturer.ID%TYPE;
16    BEGIN
17      SELECT ID
18        INTO myLecturerID
19        FROM lecturer
20        WHERE first_name = p_FirstName
21        AND last_name = p_LastName;
22
23      INSERT INTO myStudent (student_id, department, course)
24        VALUES (myLecturerID, p_Department, p_Course);
25      COMMIT;
26    END AddStudent;
27
28  END ClassPackage;
29  /

Package body created. SQL> drop table myStudent; Table dropped. SQL> drop table session; Table dropped. SQL> drop table lecturer; Table dropped.


 </source>
   
  


Package for output employee table and log message

   <source lang="sql">
   

SQL> SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,

 2                    ENAME VARCHAR2(10),
 3                    JOB VARCHAR2(9),
 4                    MGR NUMBER(4),
 5                    HIREDATE DATE,
 6                    SAL NUMBER(7, 2),
 7                    COMM NUMBER(7, 2),
 8                    DEPTNO NUMBER(2));

Table created. SQL> SQL> INSERT INTO EMP VALUES (7369, "SMITH", "CLERK", 7902, TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7499, "ALLEN", "SALESMAN", 7698, TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7521, "WARD", "SALESMAN", 7698, TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7566, "JONES", "MANAGER", 7839, TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES (7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES (7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10); 1 row created. SQL> SQL> create table myLogTable(

 2    username varchar2(30),
 3    date_time timestamp,
 4    message varchar2(4000) );

Table created. SQL> SQL> SQL> SQL> create or replace

 2  package employee_pkg as
 3    procedure print_ename( p_empno number );
 4    procedure print_sal( p_empno number );
 5  end employee_pkg;
 6  /

Package created. SQL> SQL> create or replace

 2    package body employee_pkg as
 3
 4      procedure log_message( p_message varchar2 ) is
 5      pragma autonomous_transaction;
 6      begin
 7        insert into myLogTable( username, date_time, message )
 8        values ( user, current_date, p_message );
 9        commit;
10      end log_message;
11
12      function get_emp_record( p_empno number ) return emp%rowtype is
13        l_emp_record emp%rowtype;
14      begin
15        log_message( "Looking for record where EMPNO = " || p_empno );
16        select *
17          into l_emp_record
18          from emp
19         where empno = p_empno;
20        return l_emp_record;
21      exception
22        when NO_DATA_FOUND then
23          return null;
24      end get_emp_record;
25
26      procedure print_data( p_emp_record emp%rowtype,
27                            p_column varchar2 ) is
28        l_value varchar2(4000);
29      begin
30        if p_emp_record.empno is null then
31          log_message( "No Data Found." );
32          dbms_output.put_line( "No Data Found." );
33        else
34          case p_column
35            when "ENAME" then
36              l_value := p_emp_record.ename;
37            when "SAL" then
38              l_value := nvl(p_emp_record.sal,0);
39            else
40              l_value := "Invalid Column";
41          end case;
42          log_message( "About to print " || p_column || " = " || l_value );
43          dbms_output.put_line( p_column || " = " || l_value );
44        end if;
45      end print_data;
46
47      procedure print_ename( p_empno number ) is
48      begin
49        print_data( get_emp_record( p_empno ), "ENAME" );
50      end print_ename;
51
52      procedure print_sal( p_empno number ) is
53      begin
54        print_data( get_emp_record( p_empno ), "SAL" );
55      end print_sal;
56
57    end employee_pkg;
58    /

Package body created. SQL> SQL> exec employee_pkg.print_ename( 7781 ); No Data Found. PL/SQL procedure successfully completed. SQL> SQL> exec employee_pkg.print_ename( 7782 ); ENAME = CLARK PL/SQL procedure successfully completed. SQL> SQL> select * from myLogTable; USERNAME DATE_TIME


---------------------------------------------------------------------------

MESSAGE








SYS 11-JUN-08 08.44.45.000000 PM Looking for record where EMPNO = 7781 SYS 11-JUN-08 08.44.45.000000 PM No Data Found. SYS 11-JUN-08 08.44.45.000000 PM Looking for record where EMPNO = 7782

USERNAME DATE_TIME


---------------------------------------------------------------------------

MESSAGE








SYS 11-JUN-08 08.44.45.000000 PM About to print ENAME = CLARK

SQL> SQL> execute employee_pkg.print_ename( 1234 ); No Data Found. PL/SQL procedure successfully completed. SQL> SQL> execute employee_pkg.print_ename( 7782 ); ENAME = CLARK PL/SQL procedure successfully completed. SQL> SQL> execute employee_pkg.print_sal( 7782 ); SAL = 2450 PL/SQL procedure successfully completed. SQL> SQL> drop table myLogTable; Table dropped. SQL> drop table emp; Table dropped.


 </source>
   
  


Package initialization.

   <source lang="sql">
   

SQL> SQL> SQL> CREATE OR REPLACE PACKAGE Random AS

 2
 3    PROCEDURE ChangeSeed(p_NewSeed IN NUMBER);
 4
 5    FUNCTION Rand RETURN NUMBER;
 6
 7    PROCEDURE GetRand(p_RandomNumber OUT NUMBER);
 8
 9    FUNCTION RandMax(p_MaxVal IN NUMBER) RETURN NUMBER;
10
11    PROCEDURE GetRandMax(p_RandomNumber OUT NUMBER,p_MaxVal IN NUMBER);
12  END Random;
13  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY Random AS

 2
 3    v_Multiplier  CONSTANT NUMBER := 2;
 4    v_Increment   CONSTANT NUMBER := 1;
 5
 6    v_Seed        number := 1;
 7
 8    PROCEDURE ChangeSeed(p_NewSeed IN NUMBER) IS
 9    BEGIN
10      v_Seed := p_NewSeed;
11    END ChangeSeed;
12
13    FUNCTION Rand RETURN NUMBER IS
14    BEGIN
15      v_Seed := MOD(v_Multiplier * v_Seed + v_Increment,(2 ** 32));
16      RETURN BITAND(v_Seed/(2 ** 16), 32767);
17    END Rand;
18
19    PROCEDURE GetRand(p_RandomNumber OUT NUMBER) IS
20    BEGIN
21      p_RandomNumber := Rand;
22    END GetRand;
23
24    FUNCTION RandMax(p_MaxVal IN NUMBER) RETURN NUMBER IS
25    BEGIN
26      RETURN MOD(Rand, p_MaxVal) + 1;
27    END RandMax;
28
29    PROCEDURE GetRandMax(p_RandomNumber OUT NUMBER,p_MaxVal IN NUMBER) IS
30    BEGIN
31      -- Simply call RandMax and return the value.
32      p_RandomNumber := RandMax(p_MaxVal);
33    END GetRandMax;
34
35  BEGIN
36    ChangeSeed(TO_NUMBER(TO_CHAR(SYSDATE, "SSSSS")));
37  END Random;
38  /

Package body created. SQL>



 </source>
   
  


Package level Exception

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE Globals AS

 2    myException EXCEPTION;
 3  END Globals;
 4  /

Package created. SQL> SQL> BEGIN

 2    BEGIN
 3      RAISE Globals.myException;
 4    END;
 5  EXCEPTION
 6    WHEN Globals.myException THEN
 7      RAISE;
 8  END;
 9  /

BEGIN

ERROR at line 1: ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at line 7

SQL> SQL>


 </source>
   
  


Package level variable as global level variable

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE global_def IS

 2     pv_execution_num PLS_INTEGER := 0;
 3     PROCEDURE increment_value (p_increment_num PLS_INTEGER);
 4  END global_def;
 5  /

Package created. SQL> BEGIN

 2     DBMS_OUTPUT.PUT_LINE("Variable Value: " || global_def.pv_execution_num);
 3     global_def.pv_execution_num := global_def.pv_execution_num + 1;
 4     DBMS_OUTPUT.PUT_LINE("Variable Value: " || global_def.pv_execution_num);
 5     global_def.pv_execution_num := global_def.pv_execution_num + 1;
 6     DBMS_OUTPUT.PUT_LINE("Variable Value: " || global_def.pv_execution_num);
 7     global_def.pv_execution_num := global_def.pv_execution_num + 1;
 8     DBMS_OUTPUT.PUT_LINE("Variable Value: " || global_def.pv_execution_num);
 9  END;
10  /

Variable Value: 3 Variable Value: 4 Variable Value: 5 Variable Value: 6 PL/SQL procedure successfully completed.


 </source>
   
  


package RECURSION

   <source lang="sql">
   

SQL> create package RECURSION is

 2   procedure A(p number);
 3   procedure B(p number);
 4   end;
 5  /

SQL> create or replace package body RECURSION is

 2
 3   procedure A(p number) is
 4   begin
 5        B(p+1);
 6   end;
 7
 8   procedure B(p number) is
 9   begin
10       A(p+1);
11   end;
12
13   end;
14  /

Package body created. SQL> SQL>



 </source>
   
  


Packages allows forward references, thus opening the possibilities for recursion.

   <source lang="sql">
   

SQL> SQL> SQL> create package RECURSION is

 2    procedure A(p number);
 3    procedure B(p number);
 4  end;
 5  /

SQL> SQL> SQL> create or replace

 2  package body RECURSION is
 3
 4  procedure A(p number) is
 5  begin
 6    if p < 5 then
 7       B(p+1);
 8    end if;
 9  end;
10
11  procedure B(p number) is
12  begin
13    if p < 5 then
14       A(p+1);
15    end if;
16  end;
17
18  end;
19  /

Package body created. SQL>



 </source>
   
  


Package with package level cursor variable

   <source lang="sql">
   

SQL> SQL> CREATE TABLE employees

 2  ( employee_id          number(10)      not null,
 3    last_name            varchar2(50)      not null,
 4    email                varchar2(30),
 5    hire_date            date,
 6    job_id               varchar2(30),
 7    department_id        number(10),
 8    salary               number(6),
 9    manager_id           number(6)
10  );

Table created. SQL> SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary,department_id ,manager_id)

 2                values ( 1001, "Lawson", "lawson@g.ru", "01-JAN-2002","MGR", 30000,1 ,1004);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id ,manager_id)

 2                values ( 1002, "Wells", "wells@g.ru", "01-JAN-2002", "DBA", 20000,2, 1005 );

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id ,manager_id)

 2                 values( 1003, "Bliss", "bliss@g.ru", "01-JAN-2002", "PROG", 24000,3 ,1004);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1004,  "Kyte", "tkyte@a.ru", SYSDATE-3650, "MGR",25000 ,4, 1005);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1005, "Viper", "sdillon@a .ru", SYSDATE, "PROG", 20000, 1, 1006);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id,manager_id)

 2                 values( 1006, "Beck", "clbeck@g.ru", SYSDATE, "PROG", 20000, 2, null);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1007, "Java", "java01@g.ru", SYSDATE, "PROG", 20000, 3, 1006);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1008, "Oracle", "oracle1@g.ru", SYSDATE, "DBA", 20000, 4, 1006);

1 row created. SQL> SQL> create or replace package people as

 2    type employees_ref_cursor_type is ref cursor return employees%rowtype;
 3
 4    function get_employee( p_employee_id in number )
 5      return employees_ref_cursor_type;
 6
 7    function get_employees( p_search in varchar2 )
 8      return employees_ref_cursor_type;
 9
10  end people;
11  /

Package created. SQL> show error No errors. SQL> SQL> create or replace package body people as

 2    function get_employee( p_employee_id in number )
 3      return employees_ref_cursor_type
 4    is
 5      l_emp employees_ref_cursor_type;
 6    begin
 7      open l_emp for
 8        select * from employees where employee_id = p_employee_id;
 9      return l_emp;
10    end get_employee;
11
12    function get_employees( p_search in varchar2 )
13      return employees_ref_cursor_type
14    is
15      l_emps employees_ref_cursor_type;
16    begin
17      open l_emps for
18        select * from employees
19         order by employee_id;
20      return l_emps;
21    end get_employees;
22  end people;
23  /

Package body created. SQL> show error No errors. SQL> SQL> drop table employees; Table dropped. SQL> SQL> --


 </source>
   
  


Persistance of packaged variables.

   <source lang="sql">
   

SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE PersistPkg AS

 2    TYPE t_StudentTable IS TABLE OF lecturer.ID%TYPE
 3      INDEX BY BINARY_INTEGER;
 4
 5    v_MaxRows NUMBER := 5;
 6
 7    PROCEDURE Readlecturer(p_StudTable OUT t_StudentTable, p_NumRows   OUT NUMBER);
 8
 9  END PersistPkg;
10  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY PersistPkg AS

 2    CURSOR StudentCursor IS
 3      SELECT ID
 4        FROM lecturer
 5        ORDER BY last_name;
 6
 7    PROCEDURE Readlecturer(p_StudTable OUT t_StudentTable,
 8                           p_NumRows   OUT NUMBER) IS
 9      v_Done BOOLEAN := FALSE;
10      v_NumRows NUMBER := 1;
11    BEGIN
12      IF NOT StudentCursor%ISOPEN THEN
13        OPEN StudentCursor;
14      END IF;
15
16      WHILE NOT v_Done LOOP
17        FETCH StudentCursor INTO p_StudTable(v_NumRows);
18        IF StudentCursor%NOTFOUND THEN
19          CLOSE StudentCursor;
20          v_Done := TRUE;
21        ELSE
22          v_NumRows := v_NumRows + 1;
23          IF v_NumRows > v_MaxRows THEN
24            v_Done := TRUE;
25          END IF;
26        END IF;
27      END LOOP;
28
29      p_NumRows := v_NumRows - 1;
30    END Readlecturer;
31  END PersistPkg;
32  /

Package body created. SQL> SQL> DECLARE

 2    myLecturerTable PersistPkg.t_StudentTable;
 3    v_NumRows NUMBER := PersistPkg.v_MaxRows;
 4    myFirstName lecturer.first_name%TYPE;
 5    v_LastName lecturer.last_name%TYPE;
 6  BEGIN
 7    PersistPkg.Readlecturer(myLecturerTable, v_NumRows);
 8    DBMS_OUTPUT.PUT_LINE(" Fetched " || v_NumRows || " rows:");
 9    FOR v_Count IN 1..v_NumRows LOOP
10      SELECT first_name, last_name
11        INTO myFirstName, v_LastName
12        FROM lecturer
13        WHERE ID = myLecturerTable(v_Count);
14      DBMS_OUTPUT.PUT_LINE(myFirstName || " " || v_LastName);
15    END LOOP;
16  END;
17  /

Fetched 5 rows: Jone Bliss Barbara Blues Rose Bond Sharon Clear Chris Elegant PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table lecturer; Table dropped. SQL>


 </source>
   
  


RESTRICT_REFERENCES pragma.

   <source lang="sql">
   

SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE StudentOps AS

 2    FUNCTION FullName(p_ID IN lecturer.ID%TYPE)
 3      RETURN VARCHAR2;
 4    PRAGMA RESTRICT_REFERENCES(FullName, WNDS, WNPS, RNPS);
 5
 6    FUNCTION NumHistoryMajors
 7      RETURN NUMBER;
 8    PRAGMA RESTRICT_REFERENCES(NumHistoryMajors, WNDS);
 9  END StudentOps;
10  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY StudentOps AS

 2    v_NumHist NUMBER;
 3
 4    FUNCTION FullName(p_ID IN lecturer.ID%TYPE)
 5      RETURN VARCHAR2 IS
 6      myResult  VARCHAR2(100);
 7    BEGIN
 8      SELECT first_name || " " || last_name
 9        INTO myResult
10        FROM lecturer
11        WHERE ID = p_ID;
12
13      RETURN myResult;
14    END FullName;
15
16    FUNCTION NumHistoryMajors RETURN NUMBER IS
17      myResult NUMBER;
18    BEGIN
19      IF v_NumHist IS NULL THEN
20        SELECT COUNT(*)
21          INTO myResult
22          FROM lecturer
23          WHERE major = "History";
24        v_NumHist := myResult;
25      ELSE
26        myResult := v_NumHist;
27      END IF;
28
29      RETURN myResult;
30    END NumHistoryMajors;
31  END StudentOps;
32  /

Package body created. SQL> SQL> drop table lecturer; Table dropped. SQL> SQL>


 </source>
   
  


Student fetch package

   <source lang="sql">
   

SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE StudentFetch AS

 2    TYPE t_lecturer IS TABLE OF lecturer%ROWTYPE
 3      INDEX BY BINARY_INTEGER;
 4    PROCEDURE OpenCursor;
 5    PROCEDURE CloseCursor;
 6    FUNCTION  FetchRows(p_BatchSize IN NUMBER := 5,p_lecturer OUT t_lecturer)RETURN BOOLEAN;
 7    PROCEDURE PrintRows(p_BatchSize IN NUMBER,p_lecturer IN t_lecturer);
 8  END StudentFetch;
 9  /

Package created. SQL> show errors No errors. SQL> SQL> CREATE OR REPLACE PACKAGE BODY StudentFetch AS

 2    CURSOR myAllLecturer IS SELECT * FROM lecturer ORDER BY ID;
 3    PROCEDURE OpenCursor IS
 4    BEGIN
 5      OPEN myAllLecturer;
 6    END OpenCursor;
 7
 8    PROCEDURE CloseCursor IS
 9    BEGIN
10      CLOSE myAllLecturer;
11    END CloseCursor;
12
13    FUNCTION FetchRows(p_BatchSize IN NUMBER := 5,p_lecturer OUT t_lecturer)
14      RETURN BOOLEAN IS
15      v_Finished BOOLEAN := TRUE;
16    BEGIN
17      FOR v_Count IN 1..p_BatchSize LOOP
18        FETCH myAllLecturer INTO p_lecturer(v_Count);
19        IF myAllLecturer%NOTFOUND THEN
20          v_Finished := FALSE;
21          EXIT;
22        END IF;
23      END LOOP;
24      RETURN v_Finished;
25    END FetchRows;
26
27    PROCEDURE PrintRows(p_BatchSize IN NUMBER,
28                        p_lecturer IN t_lecturer) IS
29    BEGIN
30      FOR v_Count IN 1..p_BatchSize LOOP
31        DBMS_OUTPUT.PUT("ID: " || p_lecturer(v_Count).ID);
32        DBMS_OUTPUT.PUT(" Name: " || p_lecturer(v_Count).first_name);
33        DBMS_OUTPUT.PUT_LINE(" " || p_lecturer(v_Count).last_name);
34      END LOOP;
35    END PrintRows;
36  END StudentFetch;
37  /

Package body created. SQL> show errors No errors. SQL> SQL> SQL> set serveroutput on SQL> SQL> DECLARE

 2    v_BatchSize NUMBER := 5;
 3    v_lecturer StudentFetch.t_lecturer;
 4  BEGIN
 5    StudentFetch.OpenCursor;
 6    WHILE StudentFetch.FetchRows(v_BatchSize, v_lecturer) LOOP
 7      StudentFetch.PrintRows(v_BatchSize, v_lecturer);
 8    END LOOP;
 9    StudentFetch.CloseCursor;
10  END;
11  /

ID: 10001 Name: Scott Lawson ID: 10002 Name: Mar Wells ID: 10003 Name: Jone Bliss ID: 10004 Name: Man Kyte ID: 10005 Name: Pat Poll ID: 10006 Name: Tim Viper ID: 10007 Name: Barbara Blues ID: 10008 Name: David Large ID: 10009 Name: Chris Elegant ID: 10010 Name: Rose Bond PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table lecturer; Table dropped. SQL> SQL>


 </source>
   
  


The pragma is not valid at the package level.

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE Auto3 AS

 2    PRAGMA AUTONOMOUS_TRANSACTION;
 3    PROCEDURE P;
 4    PROCEDURE Q;
 5  END Auto3;
 6  /

Warning: Package created with compilation errors. SQL> show errors Errors for PACKAGE AUTO3: LINE/COL ERROR


-----------------------------------------------------------------

2/10 PLS-00710: PRAGMA AUTONOMOUS_TRANSACTION cannot be specified here SQL>


 </source>
   
  


This package will not compile because the body does not match the specification.

   <source lang="sql">
   

SQL> SQL> CREATE OR REPLACE PACKAGE PackageA AS

 2    FUNCTION FunctionA(p_Parameter1 IN NUMBER,
 3                        p_Parameter2 IN DATE)
 4      RETURN VARCHAR2;
 5  END PackageA;
 6  /

Package created. SQL> show errors No errors. SQL> SQL> CREATE OR REPLACE PACKAGE BODY PackageA AS

 2    FUNCTION FunctionA(p_Parameter1 IN CHAR,
 3                        p_Parameter2 IN DATE)
 4      RETURN VARCHAR2;
 5  END PackageA;
 6  /

Warning: Package Body created with compilation errors. SQL> show errors Errors for PACKAGE BODY PACKAGEA: LINE/COL ERROR


-----------------------------------------------------------------

2/12 PLS-00323: subprogram or cursor "FUNCTIONA" is declared in a

        package specification and must be defined in the package body

2/12 PLS-00328: A subprogram body must be defined for the forward

        declaration of FUNCTIONA.

SQL> SQL> SQL>


 </source>
   
  


Use package level type as global variables

   <source lang="sql">
   

SQL> create or replace package APPLICATION_TYPES is

 2   subtype short_varchar2 is varchar2(40);
 3  end;
 4  /

Package created. SQL> create or replace procedure MY_PROC(p_input application_types.short_varchar2) is

 2       v1 application_types.short_varchar2;
 3  begin
 4      null;
 5  end;
 6  /

Procedure created. SQL> create or replace package MY_PKG is

 2   glob_var application_types.short_varchar2 := "asdf";
 3  end;
 4  /

Package created. SQL>



 </source>
   
  


Use package member variable to pass value

   <source lang="sql">
   

SQL> SQL> create table t as select * from all_objects; Table created. SQL> SQL> create or replace package myPackage

 2  as
 3      type varchar2_array is table of varchar2(30) index by binary_integer;
 4      type rc is ref cursor;
 5      procedure index_by( p_owner in varchar2, p_object_name out varchar2_array,p_object_type out varchar2_array,p_timestamp out varchar2_array );
 6      procedure ref_cursor( p_owner in varchar2, p_cursor in out rc );
 7  end;
 8  /

Package created. SQL> SQL> create or replace package body myPackage

 2  as
 3  procedure index_by( p_owner in varchar2,p_object_name out varchar2_array,p_object_type out varchar2_array,p_timestamp out varchar2_array )
 4  is
 5  begin
 6      select object_name, object_type, timestamp
 7        bulk collect into p_object_name, p_object_type, p_timestamp
 8        from t
 9       where owner = p_owner;
10  end;
11
12  procedure ref_cursor( p_owner in varchar2,p_cursor in out rc )
13  is
14  begin
15      open p_cursor for select object_name, object_type, timestamp from t where owner = p_owner;
16      end;
17  end;
18  /

Package body created. SQL> SQL> SQL> drop table t; Table dropped. SQL> SQL> SQL>



 </source>
   
  


Without RESTRICT_REFERENCES pragma.

   <source lang="sql">
   

SQL> SQL> CREATE TABLE lecturer (

 2    id               NUMBER(5) PRIMARY KEY,
 3    first_name       VARCHAR2(20),
 4    last_name        VARCHAR2(20),
 5    major            VARCHAR2(30),
 6    current_credits  NUMBER(3)
 7    );

Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10001, "Scott", "Lawson","Computer Science", 11);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)

 2                VALUES (10002, "Mar", "Wells","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10003, "Jone", "Bliss","Computer Science", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10004, "Man", "Kyte","Economics", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10005, "Pat", "Poll","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10006, "Tim", "Viper","History", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10007, "Barbara", "Blues","Economics", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10008, "David", "Large","Music", 4);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10009, "Chris", "Elegant","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10010, "Rose", "Bond","Music", 7);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10011, "Rita", "Johnson","Nutrition", 8);

1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)

 2                VALUES (10012, "Sharon", "Clear","Computer Science", 3);

1 row created. SQL> SQL> SQL> CREATE OR REPLACE PACKAGE StudentOps AS

 2
 3    FUNCTION FullName(p_ID IN lecturer.ID%TYPE)
 4      RETURN VARCHAR2;
 5    FUNCTION NumHistoryMajors
 6      RETURN NUMBER;
 7  END StudentOps;
 8  /

Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY StudentOps AS

 2    v_NumHist NUMBER;
 3
 4    FUNCTION FullName(p_ID IN lecturer.ID%TYPE)
 5      RETURN VARCHAR2 IS
 6      myResult  VARCHAR2(100);
 7    BEGIN
 8      SELECT first_name || " " || last_name
 9        INTO myResult
10        FROM lecturer
11        WHERE ID = p_ID;
12
13      RETURN myResult;
14    END FullName;
15
16    FUNCTION NumHistoryMajors RETURN NUMBER IS
17      myResult NUMBER;
18    BEGIN
19      IF v_NumHist IS NULL THEN
20        SELECT COUNT(*)
21          INTO myResult
22          FROM lecturer
23          WHERE major = "History";
24        v_NumHist := myResult;
25      ELSE
26        myResult := v_NumHist;
27      END IF;
28
29      RETURN myResult;
30    END NumHistoryMajors;
31  END StudentOps;
32  /

Package body created. SQL> SQL> SQL> drop table lecturer; Table dropped. SQL>


 </source>