Ausführung eines SQL Scripts protokollieren

Inhalt

Problem

Sehr oft hat man die Anforderung den Output von SQL Scripten zu protokollieren. Sehr einfach geht das dem SQL*Plus ‘spool’ Command. Mit einem Wrapper kann man die Protokollierung standardisieren und so dafür sorgen, dass zum Beispiel die Namen der Logfiles einheitlich sind. Bei längeren Scripts will man nach der Ausführung auch wissen, ob Fehler aufgetreten sind,

Analyse

Loesung

Mit diesem kurzen Script wird die Ausführung eines SQL Scripts protokolliert.

@runsql sql1

runsql.sql

--
-- file: runsql.sql
--
set echo off
set verify off
set pages 9999 lines 200 trimspool on
define l_sqlscript="&1"
define V_ZEIT_START VARCHAR2(30)
define V_ZEIT_FINISH VARCHAR2(30)
--
column V_ZEIT_START new_value V_ZEIT_START for a30
column V_ZEIT_FINISH new_value V_ZEIT_FINISH for a30
col instance_name for a25 head "Instance-|name"
column l_sqlscript new_value l_sqlscript
column l_spoolfile new_value l_spoolfile for a30
--
select sys_context('USERENV','DB_NAME') || '_' || user || '_&&l_sqlscript._' ||
  to_char(sysdate,'yyyymmddhh24miss') || '.log' l_spoolfile
from dual;
spool &&l_spoolfile
select to_char(systimestamp,'hh24:mi:ss.FF4') V_ZEIT_START as "Start" from dual;
--
SELECT sys_context('USERENV', 'INSTANCE_NAME') || '@' || sys_context('USERENV', 'SERVER_HOST') as instance_name FROM DUAL;
select current_scn from v$database;
PROMPT Script &&l_sqlscript wird ausgeführt ...
--
-- MAIN
--
set echo on
-- @@init.sql
@@&&l_sqlscript
--
--
select to_char(systimestamp,'hh24:mi:ss.FF4') V_ZEIT_FINISH as "Finish" from dual;
--
select ' 01 Start: ' || '&&V_ZEIT_START' || ' --' as "Laufzeit" from dual
union
select ' 02 Ende:  ' || '&&V_ZEIT_FINISH' || ' --' as "Laufzeit" from dual
union
select ' 03 Diff:  ' ||
   to_char(extract(hour from to_timestamp('&&V_ZEIT_FINISH','hh24:mi:ss.FF4') - to_timestamp('&&V_ZEIT_START','hh24:mi:ss.FF4')) ,'fm00') || ':' ||
   to_char(extract(minute from to_timestamp('&&V_ZEIT_FINISH','hh24:mi:ss.FF4') - to_timestamp('&&V_ZEIT_START','hh24:mi:ss.FF4')) ,'fm00') || ':' ||
   to_char(extract(second from to_timestamp('&&V_ZEIT_FINISH','hh24:mi:ss.FF4') - to_timestamp('&&V_ZEIT_START','hh24:mi:ss.FF4')) ,'fm00.0000')
  as "Laufzeit"
  from dual
order by 1;

set echo off
spool off
!grep 'ORA-\|SP2-'  &&l_spoolfile
undefine l_sqlscript
undefine l_spoolfile

Das Script kann einfach erweitert werden, damit auch dem aufgerufenen Script Parameter übergeben werden können:

...
define l_par1="&2"
...
@@&&l_sqlscript &&l_par1

Fazit

Referenzen