Run this PL/SQL block as SYS. This will create the Directory, grant the required privileges on the Directory and then create the External Table in the SYSTEM schema.
DECLARE
BDumploc VARCHAR2(200);
ORASID VARCHAR2(16);
ObjectExists EXCEPTION;
PRAGMA EXCEPTION_INIT(ObjectExists,-955);
BEGIN
SELECT value
INTO BDumploc
FROM v$parameter
WHERE name='background_dump_dest';
-- create the directory for the bdump dir
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY bdump_dir AS '''||
BDumploc||'''';
-- grant the necessary privileges
EXECUTE IMMEDIATE 'GRANT READ ON DIRECTORY bdump_dir TO system';
-- get the SID
SELECT instance_name INTO ORASID FROM v$instance;
-- create the external table
EXECUTE IMMEDIATE 'CREATE TABLE system.ALERT_LOG_EXT
(TEXT VARCHAR2(255)
) ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY BDUMP_DIR
ACCESS PARAMETERS
(records delimited by newline
nobadfile
nologfile
)
LOCATION (''alert_'||ORASID||'.log'')
)
REJECT LIMIT UNLIMITED'
;
EXCEPTION WHEN ObjectExists THEN NULL;
END;
/Create the function which will handle dates in the alert logCREATE OR REPLACE FUNCTION system.get_alert_log_date( text IN VARCHAR2 )
RETURN DATE
IS
InvalidDate EXCEPTION;
PRAGMA EXCEPTION_INIT(InvalidDate, -1846);
BEGIN
RETURN TO_DATE(text,'Dy Mon DD HH24:MI:SS YYYY'
,'NLS_DATE_LANGUAGE=AMERICAN');
EXCEPTION
WHEN InvalidDate THEN RETURN NULL;
END;
/Create the View to query the External TableCREATE OR REPLACE VIEW system.read_alert_log as
SELECT
LAST_VALUE(low_row_num IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) start_row
,LAST_VALUE(alert_date IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,NVL2(system.get_alert_log_date(text),ROWNUM,NULL) low_row_num
,system.get_alert_log_date(text) alert_date
,text alert_text
FROM system.alert_log_ext
)
;Query the External Table – this will list all alert log entries for the past day which have the string ‘ORA-’ SELECT alert_text FROM system.read_alert_log WHERE start_row IN (SELECT start_row FROM system.read_alert_log WHERE REGEXP_LIKE(alert_text,'ORA-') ) AND alert_date > TRUNC(SYSDATE)-1 /
No comments:
Post a Comment