最近在配置Oracle 10g在Linux上的pc环境的queue机制,按照原来在Oracle 8i Unix操作系统上的配置方案,使用daemon利用管道完成Oracle与OS间的通讯。在配置daemon时有这样一个情况发生:
原有daemon package中execute_system的写法如下:
PACKAGE BODY     daemon_bpcs AS
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);
status := DBMS_PIPE.SEND_MESSAGE('daemon_bpcs', 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;
这种写法将向'daemon_bpcs'管道发送消息和从pipe_name管道收取消息写在了一个Function中,OS端有一个daemon的守候进程监视'daemon_bpcs'管道的信息,收到后处理,将结果放入'pipe_name'管道中。这种方式在原Oracle 8i Unix上运行是没有问题的,但配置到Oracle 10g Linux上时发现,execute_system Function在执行过向'daemon_bpcs'管道发送消息的语句后,等待从pipe_name管道取得运行结果信息时,在OS端无法收取到'daemon_bpcs'管道中的信息,也会出现等待从'daemon_bpcs'管道中收取信息的现象,只有在OS端的守候进程收到消息并处理后才会将结果写入pipe_name管道。这说明实际上execute_system Function在没有执行完时没有真正执行向'daemon_bpcs'管道发送消息的动作,造成execute_system和OS守候进程出现循环等待的现象导致execute_system Function超时失败。
难道说execute_system Function只有在收取到pipe_name中的信息完成整个Function的执行后才会真正的将信息发送到'daemon_bpcs'中,那么在原来的Oracle 8i Unix系统上运行为什么没有这个问题?最后我将execute_system这个Function拆开写作两个Function,一个execute_system用来向'daemon_bpcs'管道发送消息,一个receive_result Function用来从管道pipe_name收取消息,调用时顺序调用这两个Function,问题就解决了。这两个环境的差别在于一个是Oracle 8i Unix系统,一个是Oracle 10g Linux系统,从PL/SQL的执行出的问题看,我觉得应该是Oracle的原因引起的,不过不知道是Oracle 10g的新特性,还是Oracle中有哪些参数没有设置正确呢?还是由于Unix 和 Linux系统的差别呢?请高手帮忙解答一下,万分感谢了!!