MINI MINI MANI MO

Path : /proc/self/root/opt/oracle/product/18c/dbhomeXE/sqlpatch/
File Upload :
Current File : //proc/self/root/opt/oracle/product/18c/dbhomeXE/sqlpatch/sqlpatch_bootstrap.sql

Rem
Rem $Header: rdbms/admin/sqlpatch/sqlpatch_bootstrap.sql /st_rdbms_18.0/2 2018/02/23 11:47:57 surman Exp $
Rem
Rem sqlpatch_bootstrap.sql
Rem
Rem Copyright (c) 2014, 2018, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      sqlpatch_bootstrap.sql
Rem
Rem    DESCRIPTION
Rem      This file is used only by the datapatch utility.  It will scan the
Rem      SQL patching infrastructure (dbms_sqlpatch package,
Rem      dba_registry_sqlpatch view, registry$sqlpatch table) and recreate
Rem      it as needed.
Rem
Rem      sqlpatch_bootstrap.sql is executed automatically by datapatch each
Rem      time it starts up, for all active PDBs, unless -force is specified.
Rem
Rem    NOTES
Rem      Added for bug 19189525.
Rem
Rem    BEGIN SQL_FILE_METADATA 
Rem    SQL_SOURCE_FILE: rdbms/admin/sqlpatch/sqlpatch_bootstrap.sql 
Rem    SQL_SHIPPED_FILE: rdbms/admin/sqlpatch/sqlpatch_bootstrap.sql
Rem    SQL_PHASE: SQLPATCH_BOOTSTRAP
Rem    SQL_STARTUP_MODE: NORMAL 
Rem    SQL_IGNORABLE_ERRORS: NONE 
Rem    SQL_CALLING_FILE: NONE
Rem    END SQL_FILE_METADATA
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    apfwkr      02/21/18 - Backport surman_bug-27283029 from main
Rem    surman      11/21/17 - XbranchMerge surman_bug-26281129 from main
Rem    surman      02/05/18 - 27283029: Add dba_registry_sqlpatch_ru_info
Rem    surman      09/18/17 - 26281129: Support for new release model
Rem    pjulsaks    06/29/17 - RTI 20414190: Uppercase input to create_cdbview
Rem    raeburns    06/16/17 - Bug 26170491: timestamp in registry$history
Rem    surman      05/22/17 - LRG 20310071: Grant execute on dbms_qopatch to
Rem                           datapatch_role
Rem    surman      04/17/17 - Updated requirements for application patches
Rem    surman      03/08/17 - 25425451: Intelligent bootstrap
Rem    pyam        08/24/16 - RTI 19633358: set nls_length_semantics=byte
Rem    surman      07/22/16 - 24341018: Use comments column for build label
Rem    surman      07/20/16 - 23170620: Add patch_directory
Rem    surman      06/29/16 - 23113885: Post patching support
Rem    surman      06/15/16 - 22694961: Application patches
Rem    surman      05/10/16 - 23025340: Do not recreate if only view invalid
Rem    surman      04/04/16 - 23025340: Add install_id
Rem    surman      01/26/16 - 22582783: Use CreateXML
Rem    surman      01/07/16 - 22359063: Add patch_descriptor
Rem    surman      10/01/15 - 20772435: Drop view
Rem    surman      08/20/15 - 20772435: bundle_data back to XMLType
Rem    raeburns    04/19/15 - Load dbms_registry packages
Rem    surman      03/25/15 - 20762747: UseGetClobVal()
Rem    surman      01/06/15 - Update phase
Rem    surman      10/08/14 - 19315691: bundle_data to CLOB
Rem    surman      09/15/14 - 19547370: No timestamp needed
Rem    surman      08/18/14 - Always reload dbms_sqlpatch
Rem    surman      07/17/14 - 19189525: Add bootstrap
Rem    surman      07/17/14 - Created
Rem

SET SERVEROUTPUT ON

@@?/rdbms/admin/sqlsessstart.sql

-- RTI 19633358: set nls_length_semantics to BYTE before recompiling
ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE;

VARIABLE sql_file VARCHAR2(50)
COLUMN sss NEW_VALUE sql_script

-- Validate the SQL registry table and view
DECLARE
  reloading_registry BOOLEAN := FALSE;
  current_type NUMBER;
  table_name_122 VARCHAR2(30);
  constraint_name_122 VARCHAR2(30);

  FUNCTION column_exists(p_column_name IN VARCHAR2) RETURN BOOLEAN IS
    cnt NUMBER;
  BEGIN
    -- We can't query a nice view like dba_tab_columns because it may
    -- be invalid during an upgrade.  Sigh.
    SELECT COUNT(name)
      INTO cnt
      FROM col$
      WHERE obj# = (SELECT obj#
                        FROM obj$
                        WHERE name = 'REGISTRY$SQLPATCH'
                          AND owner# = 0)
          AND name = p_column_name;

    IF cnt = 1 THEN
      RETURN TRUE;
    ELSE
      RETURN FALSE;
    END IF;
  END column_exists;

  FUNCTION column_length(p_column_name IN VARCHAR2) RETURN NUMBER IS
    l NUMBER;
  BEGIN
    -- We can't query a nice view like dba_tab_columns because it may
    -- be invalid during an upgrade.  Sigh.
    SELECT length
      INTO l
      FROM col$
      WHERE obj# = (SELECT obj#
                        FROM obj$
                        WHERE name = 'REGISTRY$SQLPATCH'
                          AND owner# = 0)
          AND name = p_column_name;

    RETURN l;
  END column_length;

  -- Returns TRUE if the specified object exists and is valid
  FUNCTION exists_and_is_valid(p_object_name IN VARCHAR2)
    RETURN BOOLEAN IS

    object_status dba_objects.status%TYPE;
  BEGIN
    SELECT status
      INTO object_status
      FROM dba_objects
      WHERE owner = 'SYS'
      AND object_name = p_object_name;

    dbms_output.put_line(p_object_name || ': ' || object_status);
    IF object_status != 'VALID' THEN
      RETURN FALSE;
    ELSE
      RETURN TRUE;
    END IF;
  EXCEPTION
    WHEN no_data_found THEN
      dbms_output.put_line(p_object_name || ': does not exist');
      RETURN FALSE;
  END exists_and_is_valid;

  -- Executes the requested statement, ignoring errors
  PROCEDURE exec_sql(p_sql IN VARCHAR2) IS
  BEGIN
    EXECUTE IMMEDIATE p_sql;
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('exec_sql(' || p_sql || ')');
      dbms_output.put_line('ignoring ' || sqlerrm);
  END exec_sql;

  -- Drops the specified registry object
  PROCEDURE drop_registry_table_and_view(p_registry_object IN VARCHAR2,
                                         p_drop_table IN BOOLEAN) IS
  BEGIN
    -- We will need to reload the registry
    reloading_registry := TRUE;

    -- Drop table if requested, ignoring errors
    IF p_drop_table THEN
      dbms_output.put_line('Dropping registry$' || p_registry_object);
      exec_sql('DROP TABLE registry$' || p_registry_object);
    END IF;

    -- Drop views and synonyms, ignoring errors
    dbms_output.put_line('Dropping dba/cdb_registry_' || p_registry_object);
    exec_sql('DROP VIEW dba_registry_' || p_registry_object);
    exec_sql('DROP PUBLIC SYNONYM dba_registry_' || p_registry_object);
    exec_sql('DROP VIEW cdb_registry_' || p_registry_object);
    exec_sql('DROP PUBLIC SYNONYM cdb_registry_' || p_registry_object);
  END drop_registry_table_and_view;

BEGIN
  :sql_file := dbms_registry.nothing_script;

  -- First check if the registry table exists and is valid
  IF NOT exists_and_is_valid('REGISTRY$SQLPATCH') THEN
    IF NOT exists_and_is_valid('DBA_REGISTRY_SQLPATCH') THEN
      -- Neither table nor view are OK, drop them both
      drop_registry_table_and_view('sqlpatch', TRUE);
    ELSE
      -- 23025340: Table is valid, view is not, drop only the view
      drop_registry_table_and_view('sqlpatch', FALSE);
    END IF;
  END IF;

  -- 27283029: Likewise for the ru_info table
  IF NOT exists_and_is_valid('REGISTRY$SQLPATCH_RU_INFO') THEN
    IF NOT exists_and_is_valid('DBA_REGISTRY_SQLPATCH_RU_INFO') THEN
      -- Neither table nor view are OK, drop them both
      drop_registry_table_and_view('sqlpatch_ru_info', TRUE);
    ELSE
      -- 23025340: Table is valid, view is not, drop only the view
      drop_registry_table_and_view('sqlpatch_ru_info', FALSE);
    END IF;
  END IF;

  IF NOT reloading_registry THEN
    -- Registry table (at least) exists.  Check for existence of new columns
    -- and create if needed

    -- 26281129: Structure of the table as of 18.1 should already be present
    -- through database creation or upgrade.  Check for the new columns to
    -- be sure.
    IF NOT column_exists('PATCH_TYPE') OR
       NOT column_exists('SOURCE_VERSION') OR
       NOT column_exists('TARGET_VERSION') OR
       column_exists('BUNDLE_SERIES') THEN
      dbms_output.put_line(
        'dba_registry_sqlpatch is in pre-18.1 format, renaming and recreating');

      SELECT 'reg$sqlpatch$122$' || TO_CHAR(systimestamp, 'YYMMDDHH24MI'),
             'reg$sqlpatch_pk$122$' || TO_CHAR(systimestamp, 'YYMMDDHH24MI')
        INTO table_name_122, constraint_name_122
        FROM sys.dual;

      dbms_output.put_line('Renaming registry$sqlpatch to ' || table_name_122);

      -- We need to rename the index and constraint first
      BEGIN
        EXECUTE IMMEDIATE
          'ALTER INDEX registry$sqlpatch_pk RENAME TO ' || constraint_name_122;
      EXCEPTION
        WHEN OTHERS THEN
          IF sqlcode = -1418 THEN
            NULL;  -- Suppress 'index does not exist' error
          ELSE
            RAISE;
          END IF;
      END;

      EXECUTE IMMEDIATE
        'ALTER TABLE registry$sqlpatch' ||
        '  RENAME CONSTRAINT registry$sqlpatch_pk TO ' || constraint_name_122;
      EXECUTE IMMEDIATE
        'ALTER TABLE registry$sqlpatch RENAME TO ' || table_name_122;

      -- Drop the view only
      drop_registry_table_and_view('sqlpatch', FALSE);
    END IF;
  END IF;

  -- Set sql_file if needed
  IF reloading_registry THEN
    :sql_file := '?/rdbms/admin/catsqlreg.sql';
  END IF;
END;
/

PROMPT IGNORABLE ERRORS: ORA-00955
SELECT :sql_file AS sss FROM dual;
@&sql_script

PROMPT IGNORABLE ERRORS: NONE

-- 22694961: Create if needed and grant privileges to the datapatch role

DECLARE
  cnt NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO cnt
    FROM dba_roles
    WHERE role = 'DATAPATCH_ROLE';

  IF cnt = 0 THEN
    EXECUTE IMMEDIATE 'CREATE ROLE datapatch_role';
  END IF;
END;
/

GRANT READ ON v_$mystat TO datapatch_role;
GRANT READ ON v_$session TO datapatch_role;
GRANT READ ON v_$database TO datapatch_role;
GRANT READ ON v_$containers TO datapatch_role;
GRANT READ ON v_$instance TO datapatch_role;
GRANT READ ON gv_$pdbs TO datapatch_role;
GRANT READ ON gv_$instance TO datapatch_role;
GRANT READ ON registry$history TO datapatch_role;
GRANT READ ON dba_registry TO datapatch_role;
GRANT EXECUTE ON dbms_registry TO datapatch_role;
GRANT EXECUTE ON dbms_sqlpatch TO datapatch_role;
GRANT EXECUTE ON dbms_lock TO datapatch_role;
GRANT EXECUTE ON dbms_qopatch TO datapatch_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON dba_registry_sqlpatch
 TO datapatch_role, dba;
GRANT SELECT, INSERT, UPDATE, DELETE on dba_registry_sqlpatch_ru_info
 TO datapatch_role, dba;
GRANT ALTER SESSION TO datapatch_role;

@?/rdbms/admin/sqlsessend.sql



OHA YOOOO