DBMS_PIPE
패키지중에 RECEIVE_MESSAGE
를 사용하면 누군가가 메시지를 보낼때까지 기다리게 하는 것이 가능하다.
SQL> create or replace procedure wait_for_signal(p_maxwait number default dbms_pipe.maxwait)
is
v_status number;
v_received varchar2(1);
begin
v_status := dbms_pipe.receive_message('signal',p_maxwait); //named pipe의 메세지를 로컬 버퍼로 전송(파이프명,대기시간)
if v_status = 0 then
dbms_pipe.unpack_message(v_received);//로컬 버퍼로부터 메세지를 읽는다. (값)
end if;
end wait_for_signal;
/
SQL> create or replace procedure signal
is
v_status number;
begin
dbms_pipe.pack_message('Y'); //로컬 메세지 버퍼에 메세지를 생성한다. (값)
v_status := dbms_pipe.send_message('signal'); //로컬 버퍼에 있는 메세지를 named pipe에 보낸다. (파이프명)
// 해당 파이프가 명시적으로 생성된 것이 아니면, 암시적으로 해당 파이프명을 가지는 Public 파이프를 생성한다.
end signal;
/
--- session #1
SQL> exec dbms_application_info.set_client_info('session1');
SQL> exec wait_for_signal;
--- session #2
SQL> exec signal;
--- session #1
SQL> select count(*) from all_objects;
SYS@CX3WAS1 >exec dbms_application_info.set_client_info('session1');
PL/SQL procedure successfully completed.
SYS@CX3WAS1 >exec wait_for_signal;
PL/SQL procedure successfully completed.
SYS@CX3WAS1 >select count(*) from all_objects;
COUNT(*)
----------
23870
SYS@CX3WAS1 >col event format a30
SYS@CX3WAS1 >select * from ( select session_id, event, sql_id from v$active_session_history
2 where session_id = &sid
3 order by sample_time desc ) where rownum <= 5;
Enter value for sid: 400
old 2: where session_id = &sid
new 2: where session_id = 400
SESSION_ID EVENT SQL_ID
---------- ------------------------------ -------------
400 9tz4qu4rj9rdp
400 log file sync
400 696urnsam1bqj
400
400 g58hdppd54vru
- 강좌 URL : http://www.gurubee.net/lecture/4273
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.