1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

我们大家都知道在Oracle 8i数据库中,我们经常会发现出现会Oracle运行操作的系统命令.就一般情况而言,利用Oracle Enterprise Manager来设定作业能达到我们想要的目的.但是由于OEM在设定作业缺乏灵活性,设定的作业的参数是固定的。

在实际应用当中往往需要在SQL语句当中运行需要随时Oracle运行操作系统命令.Oracle 8i没有直接运行OS命令的语句,我们可以利用DBMS_PIPE程序包实现这一要求.

DBMS_PIPE通过创建管道,可以让至少两个进程进行通信.Oracle的管道与操作系统的管道在概念上有相同的地方,但是在实现机制不同. 下面介绍实现具体步骤:

1 创建一个程序包,姑且起名叫DAEMON,SQL语句如下:

创建daemon程序包

CREATEORREPLACEPACKAGEBODYdaemonAS

execute_system是实现运行os命令的函数

FUNCTIONexecute_system(commandVARCHAR2, 
timeoutNUMBERDEFAULT10) 
RETURNNUMBERIS 
statusNUMBER; 
resultVARCHAR2(20); 
command_codeNUMBER; 
pipe_nameVARCHAR2(30); 
BEGIN 
pipe_name:=DBMS_PIPE.UNIQUE_SESSION_NAME; 
DBMS_PIPE.PACK_MESSAGE(''SYSTEM''); 
DBMS_PIPE.PACK_MESSAGE(pipe_name); 
DBMS_PIPE.PACK_MESSAGE(command); 

向daemon管道发送表示命令的字符

status:=DBMS_PIPE.SEND_MESSAGE(''daemon'',timeout); 
IFstatus<>0THEN 
RAISE_APPLICATION_ERROR(-20010, 
''Execute_system:Errorwhilesending.Status=''||status); 
ENDIF; 
status:=DBMS_PIPE.RECEIVE_MESSAGE(pipe_name,timeout); 
IFstatus<>0THEN 
RAISE_APPLICATION_ERROR(-20011, 
''Execute_system:Errorwhilereceiving. 
Status=''||status); 
ENDIF; 

获取返回结果

DBMS_PIPE.UNPACK_MESSAGE(result); 
IFresult<>''done''THEN 
RAISE_APPLICATION_ERROR(-20012, 
''Execute_system:Donenotreceived.''); 
ENDIF; 

DBMS_PIPE.UNPACK_MESSAGE(command_code); 
DBMS_OUTPUT.PUT_LINE(''Systemcommandexecuted.result=''|| 
command_code); 
RETURNcommand_code; 
ENDexecute_system; 
stop是让daemon停止*/ 
PROCEDUREstop(timeoutNUMBERDEFAULT10)IS 
statusNUMBER; 
BEGIN 
DBMS_PIPE.PACK_MESSAGE(''STOP''); 
status:=DBMS_PIPE.SEND_MESSAGE(''daemon'',timeout); 
IFstatus<>0THEN 
RAISE_APPLICATION_ERROR(-20030, 
''stop:errorwhilesending.status=''||status); 
ENDIF; 
ENDstop; 
ENDdaemon;

通过Sql*Plus运行以上语句,将为当前用户创建daemon程序包.

本文来源:1818IP

本文地址:https://www.1818ip.com/post/11035.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。