 |
|
Interfacing Oracle with Windows scripts
Oracle Database Tips by Donald Burleson |
Veterans of UNIX
(Solaris, HP/UX) and Linux knows that these environments offer
superb environments for writing automated procedures (ksh, bash,
etc.). However, we are more limited in Windows when we
want to create scripts that interface with Oracle. There
are many third-party tools (e.g. SFU, Windows Services for
Unix), but it can be handy to be able to invoke Oracle from a
standard DOS command list file.
This blog notes the DOS command line interface to Oracle
in this Windows bat file executable:
@ECHO off
SET DBUser=%1
SET DBPass=%2
SET DBTNS=%3
SET LOG=\temp\test\
ECHO spool %LOG%OraCall.log
> %LOG%OraCall.sql
ECHO set linesize 132
>> %LOG%OraCall.sql
ECHO COL x_tns NEW_VALUE v_tns
NOPRINT
>> %LOG%OraCall.sql
ECHO COL x_dbid NEW_VALUE v_dbid
NOPRINT
>> %LOG%OraCall.sql
ECHO COL x_dbname NEW_VALUE v_dbname
NOPRINT
>> %LOG%OraCall.sql
ECHO SELECT '%DBTNS%' x_tns
FROM dual;
>> %LOG%OraCall.sql
ECHO SELECT dbid x_dbid
FROM v$database;
>> %LOG%OraCall.sql
ECHO SELECT name x_dbname
FROM v$database;
>> %LOG%OraCall.sql
ECHO @SQLSelect.sql
>> %LOG%OraCall.sql
ECHO spool off
>> %LOG%OraCall.sql
ECHO exit
>> %LOG%OraCall.sql
sqlplusw -s "%DBUser%/%DBPass%@%DBTNS%" @%LOG%OraCall.sql
> %LOG%OraCall.lst
The trick is that the SQL*Plus
invocation spool the output on a single command line:
sqlplusw -s "%DBUser%/%DBPass%@%DBTNS%"
@%LOG%OraCall.sql > %LOG%OraCall.lst
For working Oracle Windows Scripts,
Jeff Hunter, author of "Conducting
the Java Job Interview" has working Windows Oracle scripts
here, including JavaScript/Oracle and visual basic/Oracle
interface scripts:
Lets examine Hunter's
export___.bat Oracle Windows script. Note that he builds
the exp parfile arguments into a DOS variable called %PARFILE%,
just like you can invoke Oracle directly from the DOS prompt (on
one line only) : e.g.
c:> exp=%PARFILE%:
REM
+--------------------------------------------------------------------------+
REM | VALIDATE COMMAND-LINE
PARAMETERS |
REM
+--------------------------------------------------------------------------+
if (%1)==() goto USAGE
if (%2)==() goto USAGE
if (%3)==() goto USAGE
REM
+--------------------------------------------------------------------------+
REM | VALIDATE ENVIRONMENT
VARIABLES |
REM
+--------------------------------------------------------------------------+
REM set ORABACKUP=C:\oracle\orabackup\JEFFDB\export
REM set ORALOG=C:\oracle\custom\oracle\log
REM set ORATMP=C:\oracle\custom\oracle\temp
if (%ORALOG%)==() goto ENV_VARIABLES
if (%ORATMP%)==() goto ENV_VARIABLES
if (%ORABACKUP%)==() goto ENV_VARIABLES
REM
+--------------------------------------------------------------------------+
REM | DECLARE ALL GLOBAL
VARIABLES. |
REM
+--------------------------------------------------------------------------+
set FILENAME=export_backup_online_full_9i
set DB_USERNAME=%1%
set DB_PASSWORD=%2%
set TNS_ALIAS=%3%
set PARFILE=%ORATMP%\%FILENAME%_%TNS_ALIAS%.parfile
set LOGFILE=%ORALOG%\%FILENAME%_%TNS_ALIAS%.log
set DUMPFILE=%ORABACKUP%\exp_full_%TNS_ALIAS%.dmp
REM
+--------------------------------------------------------------------------+
REM | REMOVE OLD LOG AND PARAMETER FILE(S).
|
REM
+--------------------------------------------------------------------------+
del /q %PARFILE%
del /q %LOGFILE%
REM
+--------------------------------------------------------------------------+
REM | WRITE EXPORT PARAMETER
FILE. |
REM
+--------------------------------------------------------------------------+
echo userid=%DB_USERNAME%/%DB_PASSWORD%@%TNS_ALIAS% > %PARFILE%
echo buffer=50000000 >> %PARFILE%
echo file=%DUMPFILE% >> %PARFILE%
echo compress=n >> %PARFILE%
echo grants=y >> %PARFILE%
echo indexes=y >> %PARFILE%
echo direct=no >> %PARFILE%
echo log=%LOGFILE% >> %PARFILE%
echo rows=y >> %PARFILE%
echo consistent=y >> %PARFILE%
echo full=y >> %PARFILE%
REM echo owner=(SCOTT) >> %PARFILE%
REM echo tables=(EMP, DEPT) >> %PARFILE%
echo triggers=y >> %PARFILE%
echo statistics=none >> %PARFILE%
echo constraints=y >> %PARFILE%
REM
+--------------------------------------------------------------------------+
REM | MOVE OLD EXPORT (DUMP)
FILE. |
REM
+--------------------------------------------------------------------------+
del /q %DUMPFILE%.backup
move %DUMPFILE% %DUMPFILE%.backup
REM
+--------------------------------------------------------------------------+
REM | PERFORM
EXPORT.
|
REM
+--------------------------------------------------------------------------+
exp parfile=%PARFILE%
REM
+--------------------------------------------------------------------------+
REM | SCAN THE EXPORT LOGFILE FOR
ERRORS. |
REM
+--------------------------------------------------------------------------+
echo ...
echo Analyzing log file for EXP- errors...
findstr /I /C:"EXP-" %LOGFILE%
if errorlevel 0 if not errorlevel 1 echo EXP- Errors:
%FILENAME% %TNS_ALIAS% %COMPUTERNAME% %DATE% %TIME% %LOGFILE%
echo ...
echo Analyzing log file for ORA- errors...
findstr /I /C:"ORA-" %LOGFILE%
if errorlevel 0 if not errorlevel 1 echo ORA- Errors:
%FILENAME% %TNS_ALIAS% %COMPUTERNAME% %DATE% %TIME% %LOGFILE%
echo ...
echo Analyzing log file for warnings...
findstr /I /C:"Export terminated successfully with warnings"
%LOGFILE%
if errorlevel 0 if not errorlevel 1 echo WARNING: %FILENAME% %TNS_ALIAS%
%COMPUTERNAME% %DATE% %TIME% %LOGFILE%
echo ...
echo Analyzing log file for errors...
findstr /I /C:"Export terminated unsuccessfully" %LOGFILE%
if errorlevel 0 if not errorlevel 1 echo ERROR: %FILENAME% %TNS_ALIAS%
%COMPUTERNAME% %DATE% %TIME% %LOGFILE%
echo ...
echo END OF FILE REPORT
echo Filename : %FILENAME%
echo Database : %TNS_ALIAS%
echo Hostname : %COMPUTERNAME%
echo Date : %DATE%
echo Time : %TIME%
echo EXP Log File : %LOGFILE%