/*创建daemon程序包*/
CREATE OR REPLACE PACKAGE BODY daemon AS
/*execute_system是实现运行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; [page]
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;