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