/*创建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;
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;