Oracle DBMS_SQLPATCH
Version 26ai

General Information
Library Note Morgan's Library Page Header
The best Oracle News for FY2026

Oracle Database 26ai will be available on generic Linux platforms in January and soon on AIX and Windows
Purpose Undocumented support utility supporting SQL patching.
AUTHID DEFINER
Constants
Name Data Type Value
build_header VARCHAR2(200) '$Header: rdbms/admin/dbmssqlpatch.sql /main/16 2018/01/09 13:05:23 surman Exp $';
Cursors CURSOR all_patches_cursor IS
SELECT *
FROM (SELECT dba_registry_sqlpatch.*, rowid registry_rowid,
RANK() OVER (PARTITION BY patch_id, patch_uid
ORDER BY install_id DESC, action_time DESC) r
FROM dba_registry_sqlpatch)
WHERE r = 1
ORDER BY patch_id, patch_uid;

-- Returns the most recent entry for all interim patches
CURSOR all_interims_cursor IS
SELECT *
FROM (SELECT dba_registry_sqlpatch.*, rowid registry_rowid,
RANK() OVER (PARTITION BY patch_id, patch_uid
ORDER BY install_id DESC, action_time DESC) r
FROM dba_registry_sqlpatch
WHERE patch_type = 'INTERIM')
WHERE r = 1
ORDER BY patch_id, patch_uid;

-- Returns the most recent release update entry, which is the current RU installed.
--  This could be any flavor of release update patch,i.e. an RU or RUR or CU.
-- Note that the most recent entry may not have been successful.

CURSOR current_ru_cursor IS
SELECT *
FROM (SELECT dba_registry_sqlpatch.*, rowid registry_rowid,
RANK() OVER (ORDER BY install_id DESC, action_time DESC) r
FROM dba_registry_sqlpatch
WHERE patch_type != 'INTERIM')
WHERE r = 1;

-- Returns the most recent successful release update entry.
-- There may have been subsequent unsuccessful release update install attempts.

CURSOR last_successful_ru_cursor IS
SELECT *
FROM (SELECT dba_registry_sqlpatch.*, rowid registry_rowid,
RANK() OVER (ORDER BY install_id DESC, action_time DESC) r
FROM dba_registry_sqlpatch
WHERE patch_type != 'INTERIM'
AND status = 'SUCCESS')
WHERE r = 1;
Data Types TYPE registry_record IS RECORD (
install_id               NUMBER,
patch_id                 NUMBER,
patch_uid                NUMBER,
patch_type               VARCHAR2(10),
flags                    VARCHAR2(10),
action                   VARCHAR2(15),
status                   VARCHAR2(25),
action_time              TIMESTAMP,
description              VARCHAR2(100),
source_version           VARCHAR2(15),
source_build_description VARCHAR2(80),
source_build_timestamp   TIMESTAMP,
target_version           VARCHAR2(15),
target_build_description VARCHAR2(80),
target_build_timestamp   TIMESTAMP,
registry_rowid           VARCHAR2(25));

TYPE registry_table IS TABLE of registry_record;
Dependencies
DBA_REGISTRY_SQLPATCH DBMS_SQLPATCH_STATE PROPS$
DBMS_OUTPUT DBMS_STANDARD V$INSTANCE
DBMS_QOPATCH DBMS_SYSTEM XMLTYPE
DBMS_SQLPATCH_FILES DUAL  
Documented No
First Available 12.1
Security Model Owned by SYS with no privileges granted
Pragma PRAGMA SUPPLEMENTAL_LOG_DATA(default, NONE);
Source {ORACLE_HOME}/rdbms/admin/dbmssqlpatch.sql
Subprograms
 
ALL_PATCHES
Returns the most recent entry for all patches in the registry dbms_sqlpatch.all_patches RETURN registry_table PIPELINED;
SELECT * FROM TABLE(dbms_sqlpatch.all_patches);

no rows selected
 
BODY_BUILD_HEADER
Returns the header dbms_sqlpatch.body_build_header RETURN VARCHAR2;
SELECT dbms_sqlpatch.body_build_header;

BODY_BUILD_HEADER
------------------------------------------------------------------------------------
$Header: rdbms/src/server/dict/plsicds/prvtsqlpatch.sql /main/41 2023/03/24 00:24:53 facero Exp $
 
CLEAR_STATE
Removes all saved state from the dbms_sqlpatch_state table (and what a poorly named table if ever there was one. dbms_sqlpatch.clear_state;
desc dbms_sqlpatch_state

Name                          Null?    Type
----------------------------- -------- --------------------
ACTIVE                                 CHAR(1)
S_CURRENT_PATCH_ID            NOT NULL NUMBER
S_CURRENT_PATCH_UID           NOT NULL NUMBER
S_CURRENT_PATCH_TYPE                   VARCHAR2(10)
S_CURRENT_PATCH_ACTION                 VARCHAR2(15)
S_CURRENT_PATCH_DESCRIPTION            VARCHAR2(100)
S_CURRENT_PATCH_FLAGS                  VARCHAR21(10)
S_CURRENT_PATCH_DESCRIPTOR              XMLTYPE
S_CURRENT_PATCH_DIRECTORY               BLOB
S_CURRENT_SOURCE_VERSION                VARCHAR2(15)
S_CURRENT_SOURCE_BUILD_DESC             VARCHAR2(80)
S_CURRENT_SOURCE_TS                     TIMESTAMP(6)
S_CURRENT_TARGET_VERSION                VARCHAR2(15)
S_CURRENT_TARGET_BUILD_TS               TIMESTAMP(6)
S_CURRENT_RU_LOGFILE                    VARCHAR2(500)
S_CURRENT_REGISTRY_ROWID                ROWID
S_NOTHING_SQL                           VARCHAR2(30)
S_DEBUG                                 CHAR(1)
S_FORCE                                 CHAR(1)
S_INIT_COMPLETE                         CHAR(1)
S_CACHED_LSINVENTORY                    XMLTYPE
S_SESSION_INSTALL_ID                    NUMBER
S_APP_MODE                              CHAR(1)
S_CONTAINER_NAME                        VARCHAR2(128)
S_CACHED_PENDING_ACTIVITY               XMLTYPE
S_ATTEMPT                               NUMBER

exec dbms_sqlpatch.clear_state;

PL/SQL procedure successfully completed.
 
CURRENT_RU_VERSION
Returns the current RU installed dbms_sqlpatch.current_ru_version RETURN registry_table PIPELINED;
SELECT * FROM TABLE(dbms_sqlpatch.current_ru_version);

no rows selected
 
EVENT_VALUE
Returns the value of the specified event dbms_sqlpatch.event_value(p_event IN NUMBER) RETURN NUMBER;
SELECT dbms_sqlpatch.event_value(1);

DBMS_SQLPATCH.EVENT_VALUE(1)
----------------------------
                           0
 
GET_OPATCH_LSINVENTORY
Wrapper around queryable inventory's get_opatch_lsinventory function. Caches the result and returns the full inventory dbms_sqlpatch.get_opatch_lsinventory RETURN XMLTYPE;
SELECT dbms_sqlpatch.get_opatch_lsinventory;

GET_OPATCH_LSINVENTORY
---------------------------------------------------
<?xml version="1.0" encoding="US-ASCII" standalone='yes'?>
<InventoryInstance>
  <oracleHome>
    <UId>OracleHome-9625bcaa-ac52-4cff=b2a0-6ef22fc93e37</UId>
...
<nodelist>
    <node xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="Host">
      <UId>Host-1a0efe27-0f0a-4fa4-869c-cae187cd69d8</UId>
      <targetTypeId>host</targetTypeId>
      <nodeName/>
    </node>
  </nodelist>
</InventoryInstance>
 
INSTALLED_PATCHES
Returns the current state of the SQL registry dbms_sqlpatch.installed_patches RETURN registry_table PIPELINED;
SELECT * FROM TABLE(dbms_sqlpatch.installed_patches);

no rows selected
 
INSTALL_FILE
For the current patch and mode, determines if the file should be run. Returns the name of the file to be run, which will either be the supplied input file (prefixed with top_directory supplied during initialize) or dbms_registry.nothing_script if the file does not need to be run. dbms_sqlpatch.install_file(sql_file IN VARCHAR2) RETURN VARCHAR2;
TBD
 
LAST_SUCCESSFUL_RU_VERSION
Returns the most recent successful RU installed dbms_sqlpatch.last_successful_ru_version RETURN registry_table PIPELINED;
SELECT * FROM TABLE(dbms_sqlpatch.last_successful_ru_version);

no rows selected
 
OPATCH_REGISTRY_STATE
Wrapper around queryable inventory's get_pending_activity function returning an XML string representing the state of SQL patches installed in the opatch inventory. dbms_sqlpatch.opatch_registry_state RETURN XMLTYPE;
SELECT dbms_sqlpatch.opatch_registry_state;

OPATCH_REGISTRY_STATE
-----------------------------------------------
<activityRoot>
  <p36194978>
    <patchUId>25532399</patchUId>
  </p36194978>
</activityRoot>
 
PATCH_FINALIZE
Performs any finalization necessary for the current patch. This includes clearing the package state and updating the SQL registry dbms_sqlpatch.patch_finalize;
exec dbms_sqlpatch.patch_finalize;

PL/SQL procedure successfully completed.
 
PATCH_INITIALIZE
Performs any initialization necessary for the given patch, including the initial insert to the SQL registry dbms_sqlpatch.patch_initialize(
p_patch_id  IN NUMBER,
p_patch_uid IN NUMBER,
p_logfile   IN VARCHAR2);
TBD
 
SESSION_INITIALIZE
Performs session initialization before patch_initialize can begin dbms_sqlpatch.session_initialize(
p_force       IN BOOLEAN  := FALSE,
p_debug       IN BOOLEAN  := FALSE,
p_app_mode    IN BOOLEAN  := FALSE,
p_nothing_sql IN VARCHAR2 := NULL,
p_attempt     IN NUMBER   := NULL);
exec dbms_sqlpatch.session_initialize(TRUE);

PL/SQL procedure successfully completed.
 
SET_FILE_METADATA
Sets file metadata before patch_initialize can begin dbms_sqlpatch.set_file_metadata(
p_patch_id     IN NUMBER,
p_patch_uid    IN NUMBER,
p_install_file IN VARCHAR2,
p_actual_file  IN VARCHAR2);
TBD
 
SET_PATCH_METADATA
Called directly by datapatch prior to patch_initialize dbms_sqlpatch.set_patch_metadata(p_patch IN dba_registry_sqlpatch%ROWTYPE);
TBD
 
SQL_REGISTRY_STATE
Performs session initialization. Must be called before patch_initialize dbms_sqlpatch.sql_registry_state RETURN XMLType;
SELECT dbms_sqlpatch.sql_registry_state;

SQL_REGISTRY_STATE
------------------------------
<sql_registry_state>
  <!-- Interim patches -->
  <patch type="INTERIM" id="36194978" uid="25532339" description="SQLPATCH RESET BASE 23.4 Daatabase Release : 23.4.0.0.0 (36194978)" action="APPLY" status="SUCCESS" target_version="23.4.0.24.05"/>
  <!-- Release Update patch -->
</sql_registry_state>
 
UPDATE_PATCH_METADATA
Updates patch metadata before patch_initialize can begin dbms_sqlpatch.update_patch_metadata(
p_patch_id   IN NUMBER,
p_patch_uid  IN NUMBER,
p_ru_logfile IN VARCHAR2 := NULL,
p_flags      IN VARCHAR2 := NULL);
TBD
 
VERIFY_QUERYABLE_INVENTORY
Tests queryable inventory functionality
If working properly returns 'OK'
dbms_sqlpatch.verify_queryable_inventory RETURN VARCHAR2;
SELECT dbms_sqlpatch.verify_queryable_inventory;

VERIFY_QUERYABLE_INVENTORY
--------------------------
OK

Related Topics
Built-in Functions
Built-in Packages
DBMS_INTERNAL_ROLLING
DBMS_QOPATCH
DBMS_ROLLING
What's New In 21c
What's New In 26ai

Morgan's Library Page Footer
This site is maintained by Daniel Morgan. Last Updated: This site is protected by copyright and trademark laws under U.S. and International law. © 1998-2026 Daniel A. Morgan All Rights Reserved