CREATE OR REPLACE PACKAGE SERIALLY_REUSABLE_pkg IS
PRAGMA SERIALLY_REUSABLE;
TYPE Strtable_type IS TABLE OF VARCHAR2(200) INDEX BY
BINARY_INTEGER;
Numval NUMBER := 10;
Strval VARCHAR2(200) := 'default-init-value';
Strtype Strtable_type;
PROCEDURE Printvalues;
PROCEDURE Initializevalues(N NUMBER, V VARCHAR2);
END SERIALLY_REUSABLE_pkg;

CREATE OR REPLACE PACKAGE BODY SERIALLY_REUSABLE_pkg IS
PRAGMA SERIALLY_REUSABLE;
PROCEDURE Printvalues IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Numval: ' || SERIALLY_REUSABLE_pkg.Numval);
DBMS_OUTPUT.PUT_LINE('Strval: ' || SERIALLY_REUSABLE_pkg.Strval);
DBMS_OUTPUT.PUT_LINE('No of elements in table: ' || SERIALLY_REUSABLE_pkg.Strtype.Count);
FOR i IN 1..SERIALLY_REUSABLE_pkg.Strtype.Count LOOP DBMS_OUTPUT.PUT_LINE(
SERIALLY_REUSABLE_pkg.Strtype(i));
END LOOP;
END;
PROCEDURE Initializevalues(N NUMBER, V VARCHAR2) AS
BEGIN
SERIALLY_REUSABLE_pkg.Numval := N;
SERIALLY_REUSABLE_pkg.Strval := V;
FOR i IN 1..n LOOP
SERIALLY_REUSABLE_pkg.Strtype(i) := V || ' ' || i;
END LOOP;
Printvalues;
END;
END SERIALLY_REUSABLE_pkg;

BEGIN
DBMS_OUTPUT.PUT_LINE('Initializing and printing
SERIALLY_REUSABLE_pkg state..');
SERIALLY_REUSABLE_pkg.Initializevalues(4, 'CADCIM TECHNOLOGIES');
DBMS_OUTPUT.PUT_LINE('Printing package state in the same CALL...');
SERIALLY_REUSABLE_pkg.Printvalues;
END;

BEGIN
DBMS_OUTPUT.PUT_LINE('Printing package state in the next CALL...');
SERIALLY_REUSABLE_pkg.Printvalues;
END;