一般的情况下在Oracle 8i中,经常会出现这种情况,即,在存储过程中出现Oracle运行操作系统命令,一般的情况我们就是利用Oracle Enterprise Manager来设定作业时可以达到这个目的.但是由于OEM在设定作业缺乏灵活性,设定的作业的参数是固定的.。
在实际应用当中往往需要在SQL语句当中Oracle运行需要随时运行操作系统命令.Oracle 8i没有直接运行OS命令的语句,我们可以利用DBMS_PIPE程序包实现这一要求.
DBMS_PIPE通过创建管道,可以让至少两个进程进行通信.Oracle的管道与操作系统的管道在概念上有相同的地方,但是在实现机制不同.
下面介绍实现具体步骤:
1 创建一个程序包,姑且起名叫DAEMON,SQL语句如下:
/*创建daemon程序包*/
- CREATE OR REPLACE PACKAGE BODY daemon AS
/*execute_system是实现Oracle运行os命令的函数*/
- FUNCTION execute_system(command VARCHAR2,
- timeout NUMBER DEFAULT 10)
- RETURN NUMBER IS
- status NUMBER;
- result VARCHAR2(20);
- command_code NUMBER;
- pipe_name VARCHAR2(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);
- IF status <> 0 THEN
- RAISE_APPLICATION_ERROR(-20010,
- ''Execute_system: Error while sending. Status = '' || status);
- END IF;
- status := DBMS_PIPE.RECEIVE_MESSAGE(pipe_name, timeout);
- IF status <> 0 THEN
- RAISE_APPLICATION_ERROR(-20011,
- ''Execute_system: Error while receiving.
- Status = '' || status);
- END IF;
/*获取返回结果*/
- DBMS_PIPE.UNPACK_MESSAGE(result);
- IF result <> ''done'' THEN
- RAISE_APPLICATION_ERROR(-20012,
- ''Execute_system: Done not received.'');
- END IF;
- DBMS_PIPE.UNPACK_MESSAGE(command_code);
- DBMS_OUTPUT.PUT_LINE(''System command executed. result = '' ||
- command_code);
- RETURN command_code;
- END execute_system;
/*stop是让daemon停止*/
- PROCEDURE stop(timeout NUMBER DEFAULT 10) IS
- status NUMBER;
- BEGIN
- DBMS_PIPE.PACK_MESSAGE(''STOP'');
- status := DBMS_PIPE.SEND_MESSAGE(''daemon'', timeout);
- IF status <> 0 THEN
- RAISE_APPLICATION_ERROR(-20030,
- ''stop: error while sending. status = '' || status);
- END IF;
- END stop;
- END daemon;
通过Sql*Plus运行以上语句,将为当前用户创建daemon程序包. 上述的相关内容就是在Oracle运行操作系统命令中如何创建一个程序包,姑且起名叫DAEMON,SQL语句如下的描述,希望会给你带来一些帮助在此方面。
文章出自: http://www.programbbs.com/doc/class10-3.htm
【编辑推荐】