Oracle DBMS_SQLPATCH
Version 21c

General Information
Library Note Morgan's Library Page Header
ACE Director Alum Daniel Morgan, founder of Morgan's Library, is scheduling complimentary technical Workshops on Database Security for the first 30 Oracle Database customers located anywhere in North America, EMEA, LATAM, or APAC that send an email to asra_us@oracle.com. Request a Workshop for your organization today.
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_FILES DUAL
DBMS_OUTPUT DBMS_SQLPATCH_STATE PROPS$
DBMS_QOPATCH DBMS_STANDARD XMLTYPE
DBMS_REGISTRY DBMS_SYSTEM  
Documented No
First Available 12.1
Security Model Owned by SYS with EXECUTED granted to DATAPATCH_ROLE and EXECUTE_CATALOG_ROLE roles.
Pragma PRAGMA SUPPLEMENTAL_LOG_DATA(default, NONE);
Source {ORACLE_HOME}/rdbms/admin/dbmssqlpatch.sql
see also: catdwgrd.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
FROM dual;

BODY_BUILD_HEADER
------------------------------------------------------------------------------------
$Header: rdbms/src/server/dict/plsicds/prvtsqlpatch.sql /main/36 2020/03/04 06:08:16 sspulava 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                  NUMBER
S_CURRENT_PATCH_UID                 NUMBER
S_CURRENT_PATCH_VERSION             VARCHAR2(20)
S_CURRENT_PATCH_FLAGS               VARCHAR2(10)
S_CURRENT_PATCH_ACTION              VARCHAR2(15)
S_CURRENT_PATCH_STATUS              VARCHAR2(15)
S_CURRENT_PATCH_DESCRIPTION         VARCHAR2(100)
S_CURRENT_PATCH_BUNDLE_SERIES       VARCHAR2(30)
S_CURRENT_PATCH_BUNDLE_ID           NUMBER
S_CURRENT_REGISTRY_ROWID            ROWID
S_BUNDLEDATA                        XMLTYPE
S_NOTHING_SQL                       VARCHAR2(30)
S_INSTALLED_BUNDLE                  NUMBER
S_INSTALLING_BUNDLE                 NUMBER
S_DATABASE_VERSION                  VARCHAR2(20)
S_DEBUG                             CHAR(1)
S_FORCE                             CHAR(1)
S_ORACLE_HOME                       VARCHAR2(500)
S_INIT_COMPLETE                     CHAR(1)
S_CACHED_LSINVENTORY                XMLTYPE
S_CURRENT_PATCH_DESCRIPTOR          XMLTYPE
S_SUPERSEDING_BUNDLE                CHAR(1)
S_SESSION_INSTALL_ID                NUMBER
S_EXISTING_BUNDLEDATA               XMLTYPE
S_EXISTING_BUNDLE_SERIES            VARCHAR2(30)
S_EXISTING_BUNDLE_ID                NUMBER
S_APPLICATION_PATCH                 CHAR(1)
S_PATCH_DIRECTORY_ZIP               BLOB


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)
FROM dual;

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
FROM dual;

GET_OPATCH_LSINVENTORY
---------------------------------------------------
<?xml version="1.0" encoding="US-ASCII" standalone='yes'?>
<InventoryInstance>
  <oracleHome>
    <UId>OracleHome-76a41892-efac-41d3-a8d8-86a5c8193cf0</UId>
    <targetTypeId>oracle_home</targetTypeId>
    <inventoryLocation>/u01/app/oraInventory</inventoryLocation>
    <isShared>false</isShared>
    <patchingModel>oneoff</patchingModel>
    <path>/u01/app/oracle/product/21.0.0.0/dbhome_1</path>
  </oracleHome>
  <osPlatform id="226">
    <UId>FlexibleDataType-d9b0e9ae-8c0d-47fd-9f2b-126a791b93ec</UId>
    <hostName>test21.sub07212035450.testvcn01.oraclevcn.com</hostName>
    <version>Linux x86-64</version>
  </osPlatform>
  <patches/>
  <components>
    <component xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:type="OUIComponent" id="oracle.server" name="Oracle Database 21c">
      <UId>OUIComponent-5dab41c7-dafd-438a-8eac-3be0b5a7e4fa</UId>
      <description>Installs an optional preconfigured starter database, product options,
      management tools, networking services, utilities, and basic client software for an
      Oracle Database server. This option also supports Automatic Storage Management
      database configuration.</description>
      <version>21.0.0.0.0</version>
      <installedLanguage>en</installedLanguage>
      <installedLanguage>fr</installedLanguage>
      ...
      <installedLanguage>uk</installedLanguage>
      <installedLanguage>vi</installedLanguage>
    </component>
    <component xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:type="OUIComponent" id="oracle.rdbms.partitioning" name="Oracle Partitioning">
      <UId>OUIComponent-a0e2fb5e-0c34-44dc-86f7-c8d11da2f83a</UId>
      <description>provides the functionality to manage a table in smaller components
      (partitions) for manageability, performance, and availability
      benefits</description>
      <version>21.0.0.0.0</version>
      <installedLanguage>en</installedLanguage>
    </component>
    <component xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:type="OUIComponent"  id="oracle.options" name="Enterprise Edition Options">
      <UId>OUIComponent-97f2e1c6-eaf6-42ce-ac14-47824990d6d7</UId>
      <description>lists the optional features of Oracle Database 21c Enterprise
      Edition</description>
      <version>21.0.0.0.0</version>
      <installedLanguage>en</installedLanguage>
    </component>
  </components>
  <patchsets/>
  <nodelist>
    <node xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="Host">
      <UId>Host-dbe88379-5b9e-4f1b-a2ad-ae83218e1c2d</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
FROM dual;

OPATCH_REGISTRY_STATE
-----------------------------------------------
<activityRoot>
</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
FROM dual;

SQL_REGISTRY_STATE
------------------------------
<sql_registry_state>
<!-- Interim patches -->
<!-- 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 (new 21c)
Tests queryable inventory functionality
If working properly returns 'OK'
dbms_sqlpatch.verify_queryable_inventory RETURN VARCHAR2;
SELECT dbms_sqlpatch.verify_queryable_inventory
FROM dual;

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 23c

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