Ich muss den Patch-Status auf Oracle-Datenbanken abfragen. Seit Oracle Version 12c wurde die View sys.REGISTRY $ HISTORY durch die View DBA_REGISTRY_SQLPATCH ersetzt. Bei älteren Versionen wie 11g ist die Ansicht dba_registry_sqlpatch nicht vorhanden. Die folgende Abfrage erstellt Fehler in Oracle-Versionen < 12c, da die Ansicht dba_registry_sqlpatch nicht vorhanden ist. Ich muss eine Abfrage erstellen, die auf allen Oracle-Datenbankversionen ausgeführt wird. Ich kann PL/SQL nicht verwenden. Ich denke, es sollte mit einem Fallausdruck gelöst werden.Switch-Case-Ausdruck für Oracle-Datenbankversionen
/* Query for version < 11g: */
SELECT MIN (diff) diff, MIN (zeile) zeile
FROM (SELECT TO_CHAR (TRUNC (SYSDATE - TRUNC (action_time)), '9999') DIFF,
'DIFF : '
|| TO_CHAR (TRUNC (SYSDATE - TRUNC (action_time)), '9999')
|| ' DAYS '
|| 'ACTION='
|| action
|| ' VERSION='
|| version
|| ' DATE='
|| TO_CHAR (action_time, 'yyyymmdd')
|| ' ID='
|| TO_CHAR (id, '09')
|| ' COMMENTS='
|| comments
|| ' PORT='
|| (SELECT DBMS_UTILITY.port_string
FROM DUAL)
ZEILE
FROM sys.REGISTRY$HISTORY
WHERE action_time = (SELECT MAX (action_time)
FROM sys.REGISTRY$HISTORY
WHERE action IN ('APPLY', 'ROLLBACK'))
UNION ALL
/*Query for version 12c: */
(SELECT TO_CHAR (TRUNC (SYSDATE - TRUNC (action_time)), '9999') DIFF,
'DIFF : '
|| TO_CHAR (TRUNC (SYSDATE - TRUNC (action_time)), '9999')
|| ' DAYS '
|| 'ACTION='
|| action
|| ' VERSION='
|| version
|| ' DATE='
|| TO_CHAR (action_time, 'yyyymmdd')
|| ' ID='
|| TO_CHAR (patch_id)
|| ' COMMENTS='
|| description
|| ' PORT='
|| (SELECT DBMS_UTILITY.port_string
FROM DUAL)
ZEILE
FROM dba_registry_sqlpatch
WHERE action_time = (SELECT MAX (action_time)
FROM dba_registry_sqlpatch
WHERE action IN ('APPLY', 'ROLLBACK')))
UNION ALL
/* Query for no patch installed: */
SELECT (SELECT TO_CHAR (TRUNC (SYSDATE - TRUNC (created)), '9999')
FROM v$database)
DIFF,
'DIFF : '
|| (SELECT TO_CHAR (TRUNC (SYSDATE - TRUNC (created)), '9999')
FROM v$database)
|| ' DAYS ACTION=N./A. VERSION='
|| (SELECT SUBSTR (version, 1, 8)
FROM v$instance)
|| ' DATE='
|| (SELECT TO_CHAR (created, 'yyyymmdd')
FROM v$database)
|| ' ID= 99 COMMENTS='
|| (SELECT SUBSTR (version, 1, 8)
FROM v$instance)
|| ' PORT='
|| (SELECT DBMS_UTILITY.port_string
FROM DUAL)
ZEILE
FROM DUAL)
WHERE ROWNUM = 1;
Beispiel Ausgabe auf einer Oracle-Datenbank 12c gepatcht 11 Tagen: DIFF: 11 Tage ACTION = GILT VERSION = 12.1.0.2 DATE = 20160429 ID = 22809813 KOMMENTAR = WINDOWS DB BUNDLE PATCH 12.1.0.2.160419 (64bit): 22809813 PORT = IBMPC/WIN_NT64-9.1.0
12c funktioniert - nur bei älteren Versionen ist eine andere Handhabung erforderlich. – r0tt
REGISTRY $ HISTORY existiert noch in 12c, ist aber nicht ausgefüllt. – r0tt