今天下来一个新任务,要求是给客户做一个维护数据库的批处理文件。说是嫌以前用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%
<mailto:%25p_user%25/%25p_password%25@%25p_sid%25> @"%~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%
<mailto:%25p_user%25/%25p_password%25@%25p_sid%25> @"%sqlfile%" '%p_data%'

 

基本上搞定了。

 

技术
©2019-2020 Toolsou All rights reserved,
一个名叫“讨火车”的小村子 终于把火车讨来了c++内存 指针越界检测机制_CrtMemBlockHeade错误总结-myBatis plus 分页记一次EventBus内存泄露导致的项目问题服务器价格有什么差异?Android中获取当前正在显示的Activity实例创建数据mysql库流程在Vue中使用Web Worker最优化方法总结:公式解、数值优化、求解思想使用easyPOI导入Excel数据