ORACLE存儲過程管道通信的例子
2024-08-29 13:38:55
供稿:網友
/*
管道通信的例子程序
注重:1要明文給于用戶 EXECUTE ANY PROCEDURE 權力可能正常使用DBMS_PipE
2設定:set serveroutput on
共有兩個過程writepipe和readpipe
在sqlplus中通過@writepipe.sql的方式執行,可以創始過程writepipe和readpipe
通過 call writepipe('我的測試信息'); 寫信息
用 call readpipe() 讀信息
2002年4月12日
*/
CREATE OR REPLACE PROCEDURE writepipe(msg VARCHAR2) AS
n integer;
status NUMBER;
BEGIN
-- DBMS_PIPE.PACK_MESSAGE(LENGTH(msg));
DBMS_PIPE.PACK_MESSAGE(msg); --把信息放入緩沖區
status := DBMS_PIPE.SEND_MESSAGE('mypipe',1); --信息放入管道mypipe,系統等待時間為1秒
--假如status := DBMS_PIPE.SEND_MESSAGE('mypipe');那么就是等待1000天
IF status != 0 THEN
raise_application_error(-20099, 'Debug error');
END IF;
END;
/
CREATE OR REPLACE PROCEDURE readpipe AS
info varchar(30);
status integer;
begin
--接受等待時間為1秒,可以為0,立即調用或DBMS_PIPE.RECEIVE_MESSAGE('mypipe') 等待100天
status:= DBMS_PIPE.RECEIVE_MESSAGE('mypipe',1);
--status:= DBMS_PIPE.RECEIVE_MESSAGE('mypipe');
--status為0為成功可以UNPACK_MESSAGE,1為超時沒有數據,2為信息太大,3為內部錯誤
IF status <> 0 THEN
DBMS_OUTPUT.PUT_LINE('沒有信息返回,返回狀態為:'status);
return;
-- RAISE_APPLICATION_ERROR(-20021,
-- 'execute_sql: Error while receiving.
-- Status = ' status);
END IF;
DBMS_PIPE.UNPACK_MESSAGE(info);
DBMS_OUTPUT.PUT_LINE('INFO=' INFO);
end;
/