今天下来一个新任务,要求是给客户做一个维护数据库的批处理文件。说是嫌以前用access2003做的管理工具执行得太慢。这回直接把维护的SQL文做成包然后用sqlplus调用起来应该很快就能执行完。不过用户不太懂数据库,要求做一个批处理文件可以简单的输入一两个条件就能执行。
先写个标题输出,让用户知道这个批处理是干什么用的
@echo ***************************************
@echo 数据库清理工具
@echo ***************************************
下面要求要求用户输入数据库的用户连接信息,调查了一下这样写可能比较好。是否还有别的交互方式以后再说。
@echo off
set /p p_user="请输入用户名"
set /p p_password="请输入用户密码"
set /p p_sid="请输入数据库连接串(TNS名)"
set /p p_data="请输入维护时间(YYYY/MM/DD)"
判断输入内容(简单写一个例子)
if "%p_data%"=="" (goto :ERR1)
执行之前要求用户确认.这个地方本来想用choice,不过我的xp命令窗口不支持,以后调查调查再说。
set /p rtn="维护时间到%p_data%为止,开始执行吗?(Y/N)"
if "%rtn%"=="Y" (goto :EXECUTE_DELETE)
if "%rtn%"=="y" (goto :EXECUTE_DELETE) else (goto :END)
接下去调用执行语句,这里用到了传递参数,和指定当前目录的方法。
sqlplus %p_user%/%p_password%@%p_sid% @"%~dp0DELETE_START.SQL" '%p_data%'
%~dp0代表当前目录名(用/结尾)如果有目录名有空格之类的可能不认识所以用""括起来。
传递的参数可以在sql文中用&1,&2……访问
调用完毕后显示一下结果,然后按个键关闭窗口
@echo ***************************************
@echo 数据库清理工具执行完了
@echo ***************************************
pause
goto :END
下边是sql文的内容,简单写写
输出到文件
SPOOL ../CLEAN_UP.LOG
SET SERVEROUTPUT ON
声明变量 KEKKA是结果的状态数字,KEKKA_TXT是结果信息,LASTDATE是执行条件。LASTDATE接受批处理传过来的时间变量
DECLARE
KEKKA NUMBER;
KEKKA_TXT VARCHAR2(1000);
LASTDATE DATE :='&1';
BEGIN
PKG_DELETE.DEL(LASTDATE,KEKKA,KEKKA_TXT);
DBMS_OUTPUT.PUT_LINE(KEKKA);
DBMS_OUTPUT.PUT_LINE(KEKKA_TXT);
END;
/
SPOOL OFF
QUIT
这样可以基本上达到给用户使用的要求。
不过需要传给用户两个文件而且两个文件都要在同一个目录下。
想想办法能否用一个文件搞定。
看了看好像只能在批处理里调用一个sql文件的方式才能达到要求。
变通一下。在批处理文件中先生成要调用的sql文件。
方法2:
在批处理中定义生成的文件名,然后将文件内容输出到文件里
set sqlfile=sqlfile.txt
echo SPOOL ../CLEAN_UP.LOG >> %sqlfile%
echo SET SERVEROUTPUT ON >> %sqlfile%
echo DECLARE >> %sqlfile%
echo KEKKA NUMBER; >> %sqlfile%
echo KEKKA_TXT VARCHAR2(1000); >> %sqlfile%
echo LASTDATE DATE :='^&1'; >> %sqlfile%
这里要注意&或者%输出的时候要加个^,不然这行内容就输出不出来了。
echo BEGIN >> %sqlfile%
echo PKG_DELETE.DEL(LASTDATE,KEKKA,KEKKA_TXT); >> %sqlfile%
echo DBMS_OUTPUT.PUT_LINE(KEKKA); >> %sqlfile%
echo DBMS_OUTPUT.PUT_LINE(KEKKA_TXT); >> %sqlfile%
echo END; >> %sqlfile%
echo / >> %sqlfile%
echo SPOOL OFF >> %sqlfile%
echo QUIT >> %sqlfile%
sqlplus %p_user%/%p_password%@%p_sid% @"%sqlfile%" '%p_data%'
基本上搞定了。