RESETTABLE Clause
The RESETTABLE clause is used to mark whether a PL/SQL
unit's state can be discarded by the session when the unit deems it safe to do
so.
If the state of a RESETTABLE PL/SQL unit is discarded,
subsequent reference to the unit in the same session will result in the unit
executing its initialization. The use of RESETTABLE can be
beneficial to those who use SQL Patch by avoiding ORA-04068, an
error raised when the existing state of a package has been discarded and can
otherwise occur when packages change during datapatch.
The RESETTABLE clause can appear in the following statements:
Topics
Syntax
Semantics
resettable_clause
RESETTABLE
A package or package body is resettable if the
RESETTABLE clause appears in the package specification or the
definition of the package body, respectively.
The RESETTABLE clause can be specified upon creation of a package
and a package body. The clause is set independently on the package specification and
body, meaning the property will not necessarily match. Any combination of settings
between package specification and package body are valid.
In order to update the RESETTABLE property on a package, use the
CREATE OR REPLACE PACKAGE [BODY] RESETTABLE syntax. The
ALTER PACKAGE [BODY] syntax cannot be used to change the
property.
The RESETTABLE clause cannot be used in combination with the
SERIALLY_REUSABLE pragma.
Usage Notes
You must ensure that the state of the unit is, in fact,
RESETTABLE when specifying the property. For example, in
general, packages that contain instruments that need to follow an open-close
mechanism (and they don't immediately complete the cycle) are not safe to mark
RESETTABLE, as discarding the state before the mechanism is
closed could cause a memory leak. On the other hand, packages that contain
information that can be obtained again during reinstantiation are safe to mark as
RESETTABLE.
If changes are made to a package that is marked RESETTABLE, you must
consider if the change will mean the package is no longer resettable.
Examples
Example 14-36 Creating a RESETTABLE Package Body
CREATE OR REPLACE PACKAGE res_pkg RESETTABLE AS
FUNCTION get_current_user
RETURN VARCHAR2;
END;
/
CREATE OR REPLACE PACKAGE BODY res_pkg RESETTABLE AS
NAME VARCHAR2(50);
ID PLS_INTEGER;
MAX_L CONSTANT PLS_INTEGER := ORA_MAX_NAME_LEN;
FUNCTION get_current_user RETURN VARCHAR2
IS
BEGIN
RETURN DBMS_ASSERT.enquote_name(SYS_CONTEXT('USERENV',
'CURRENT_USER'), FALSE);
END get_current_user;
END;
/
