SlideShare a Scribd company logo
Oracle Inter-Session
Communication
Oren Nakdimon
www.db-oriented.com
 oren@db-oriented.com
 +972-54-4393763
@DBoriented
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
http://db-oriented.com
Who Am
I?
INTER-SESSION COMMUNICATION
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
SGA
Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
SGA
Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Inbox
Session
Session
Outbox
Inbox Outbox
Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Inbox
Session
Session
Outbox
Inbox Outbox
Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Inbox
Session
Session
Outbox
Inbox Outbox
Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Session
Outbox
Inbox
Session
Inbox Outbox
Inbox
Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Session
Outbox
Inbox
Session
Inbox Outbox
Inbox
Outbox Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Outbox
SGA
Session
Outbox
Inbox
Inbox Outbox
Outbox
Outbox Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Outbox
SGA
Session
Outbox
Inbox
Inbox Outbox
Outbox
Outbox Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Outbox
SGA
Session
Outbox
Inbox
Inbox Outbox
Outbox
Outbox Inbox
DEMO
Logger
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
pack_message (number)
pack_message (varchar2)
pack_message (date)
pack_message_raw
pack_message_rowid
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
) is
l_status number;
begin
l_status := dbms_pipe.receive_message(pipename => c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.receive_message failed with status ' || l_status);
end if;
dbms_pipe.unpack_message(o_user);
dbms_pipe.unpack_message(o_sid);
dbms_pipe.unpack_message(o_host);
dbms_pipe.unpack_message(o_time);
dbms_pipe.unpack_message(o_text);
end get_next;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
) is
l_status number;
begin
l_status := dbms_pipe.receive_message(pipename => c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.receive_message failed with status ' || l_status);
end if;
dbms_pipe.unpack_message(o_user);
dbms_pipe.unpack_message(o_sid);
dbms_pipe.unpack_message(o_host);
dbms_pipe.unpack_message(o_time);
dbms_pipe.unpack_message(o_text);
end get_next;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
) is
l_status number;
begin
l_status := dbms_pipe.receive_message(pipename => c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.receive_message failed with status ' || l_status);
end if;
dbms_pipe.unpack_message(o_user);
dbms_pipe.unpack_message(o_sid);
dbms_pipe.unpack_message(o_host);
dbms_pipe.unpack_message(o_time);
dbms_pipe.unpack_message(o_text);
end get_next;
end pipe_demo;
unpack_message (number)
unpack_message (varchar2)
unpack_message (date)
unpack_message_raw
unpack_message_rowid
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public static void processRequests(Connection connection) throws SQLException {
String user;
int sid;
String host;
Timestamp time;
String text = " ";
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public static void processRequests(Connection connection) throws SQLException {
String user;
int sid;
String host;
Timestamp time;
String text = " ";
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public static void processRequests(Connection connection) throws SQLException {
String user;
int sid;
String host;
Timestamp time;
String text = " ";
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
PIPES
A Single Consumer
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
PIPES
Multiple Consumers
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
DEMO
Multiple Consumers
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
ALERTS (SIGNALS)
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Session
Session
Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
There is also dbms_alert.waitany
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo; There is also dbms_alert.removeall
PIPES
Request and Response
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
dbms_pipe.unique_session_name
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
DBMS_PIPE DBMS_ALERT
Type Named Pipes / Queue Signals / Broadcast
Implementation SGA structure Table
Transactional? Non-Transactional Transactional
Consumers of a specific
message
Single Consumer Zero-to-Multiple Consumers
Blocked Publisher? When pipe is full (“pipe put”
wait event)
When other session signaled
to the same alert and hasn’t
committed yet (TX lock), but
only if there are registered
consumers
Possible Loss of Messages? Instance crash/shutdown Multiple signals to the same
alert before read by the
consumer
THANK YOU
Oren Nakdimon
www.db-oriented.com
 oren@db-oriented.com
 +972-54-4393763
@DBoriented

More Related Content

What's hot (13)

PPTX
New PLSQL in Oracle Database 12c
Connor McDonald
 
PDF
DBMS_SQL
Mahesh Vallampati
 
PDF
MODELS'16 - RESTalk
Ana Ivanchikj
 
PDF
Firebird 3 Windows Functions
Mind The Firebird
 
PDF
JAX-RS and CDI Bike the (Reactive) Bridge
José Paumard
 
PPTX
PL/SQL Fundamentals I
Nick Buytaert
 
PPT
Oracle PLSQL Step By Step Guide
Srinimf-Slides
 
PDF
Deep Dive Java 17 Devoxx UK
José Paumard
 
PPT
06 Using More Package Concepts
rehaniltifat
 
PPT
DAC training-batch -2020(PLSQL)
RajKumarSingh213
 
PPTX
ORACLE PL SQL FOR BEGINNERS
mohdoracle
 
PPTX
Managing Unstructured Data: Lobs in the World of JSON
Michael Rosenblum
 
PPT
PL/SQL
Vaibhav0
 
New PLSQL in Oracle Database 12c
Connor McDonald
 
MODELS'16 - RESTalk
Ana Ivanchikj
 
Firebird 3 Windows Functions
Mind The Firebird
 
JAX-RS and CDI Bike the (Reactive) Bridge
José Paumard
 
PL/SQL Fundamentals I
Nick Buytaert
 
Oracle PLSQL Step By Step Guide
Srinimf-Slides
 
Deep Dive Java 17 Devoxx UK
José Paumard
 
06 Using More Package Concepts
rehaniltifat
 
DAC training-batch -2020(PLSQL)
RajKumarSingh213
 
ORACLE PL SQL FOR BEGINNERS
mohdoracle
 
Managing Unstructured Data: Lobs in the World of JSON
Michael Rosenblum
 
PL/SQL
Vaibhav0
 

Similar to Oracle Inter-Session Communication (20)

PDF
Oracle RDBMS architecture
Martin Berger
 
DOC
3963066 pl-sql-notes-only
Ashwin Kumar
 
PPTX
Data Tracking: On the Hunt for Information about Your Database
Michael Rosenblum
 
PDF
Sangam 19 - PLSQL still the coolest
Connor McDonald
 
PPT
Oracle archi ppt
Hitesh Kumar Markam
 
PPT
plsql les06
sasa_eldoby
 
PPT
Homework help on oracle
Steve Nash
 
PDF
Database & Technology 1 _ Tom Kyte _ Efficient PL SQL - Why and How to Use.pdf
InSync2011
 
PDF
Oracle 11g release 2
Adel Saleh
 
PDF
2013 Collaborate - OAUG - Presentation
Biju Thomas
 
PDF
Introduction to oracle 9i pl sql - part 2
Manaswi Sharma
 
PPT
Oracle_PLSQL.ppt ..
RAMIROENRIQUERAMALLO
 
PPT
Oracle_PLSQL (1).ppt .
RAMIROENRIQUERAMALLO
 
PDF
Sql server difference faqs- 6
Umar Ali
 
PDF
2516186 oracle9i-dba-fundamentals-ii-volume-ii
Nishant Gupta
 
PDF
Bn 1016 demo postgre sql-online-training
conline training
 
PDF
Oracle to Postgres Migration - part 1
PgTraining
 
PDF
Oracle pl-sql user's guide & reference
desitaria
 
DOC
DBMS Practical File
Dushmanta Nath
 
PDF
Ebs dba con4696_pdf_4696_0001
jucaab
 
Oracle RDBMS architecture
Martin Berger
 
3963066 pl-sql-notes-only
Ashwin Kumar
 
Data Tracking: On the Hunt for Information about Your Database
Michael Rosenblum
 
Sangam 19 - PLSQL still the coolest
Connor McDonald
 
Oracle archi ppt
Hitesh Kumar Markam
 
plsql les06
sasa_eldoby
 
Homework help on oracle
Steve Nash
 
Database & Technology 1 _ Tom Kyte _ Efficient PL SQL - Why and How to Use.pdf
InSync2011
 
Oracle 11g release 2
Adel Saleh
 
2013 Collaborate - OAUG - Presentation
Biju Thomas
 
Introduction to oracle 9i pl sql - part 2
Manaswi Sharma
 
Oracle_PLSQL.ppt ..
RAMIROENRIQUERAMALLO
 
Oracle_PLSQL (1).ppt .
RAMIROENRIQUERAMALLO
 
Sql server difference faqs- 6
Umar Ali
 
2516186 oracle9i-dba-fundamentals-ii-volume-ii
Nishant Gupta
 
Bn 1016 demo postgre sql-online-training
conline training
 
Oracle to Postgres Migration - part 1
PgTraining
 
Oracle pl-sql user's guide & reference
desitaria
 
DBMS Practical File
Dushmanta Nath
 
Ebs dba con4696_pdf_4696_0001
jucaab
 
Ad

Recently uploaded (20)

PDF
Everything you need to know about pricing & licensing Microsoft 365 Copilot f...
Q-Advise
 
PDF
Technical-Careers-Roadmap-in-Software-Market.pdf
Hussein Ali
 
PPTX
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PPTX
Build a Custom Agent for Agentic Testing.pptx
klpathrudu
 
PDF
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
PPTX
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
PPTX
Get Started with Maestro: Agent, Robot, and Human in Action – Session 5 of 5
klpathrudu
 
PDF
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
PDF
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
PPTX
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Coefficient of Variance in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
ERP Consulting Services and Solutions by Contetra Pvt Ltd
jayjani123
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PDF
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
PDF
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
PDF
AOMEI Partition Assistant Crack 10.8.2 + WinPE Free Downlaod New Version 2025
bashirkhan333g
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
PDF
Salesforce Experience Cloud Consultant.pdf
VALiNTRY360
 
PPTX
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
Everything you need to know about pricing & licensing Microsoft 365 Copilot f...
Q-Advise
 
Technical-Careers-Roadmap-in-Software-Market.pdf
Hussein Ali
 
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
Build a Custom Agent for Agentic Testing.pptx
klpathrudu
 
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
Get Started with Maestro: Agent, Robot, and Human in Action – Session 5 of 5
klpathrudu
 
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Coefficient of Variance in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
ERP Consulting Services and Solutions by Contetra Pvt Ltd
jayjani123
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
AOMEI Partition Assistant Crack 10.8.2 + WinPE Free Downlaod New Version 2025
bashirkhan333g
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
Salesforce Experience Cloud Consultant.pdf
VALiNTRY360
 
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
Ad

Oracle Inter-Session Communication

  • 2. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon http://db-oriented.com Who Am I?
  • 4. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Session
  • 5. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Session
  • 6. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session SGA Session Session
  • 7. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session SGA Session Session
  • 8. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Inbox Session Session Outbox Inbox Outbox Inbox
  • 9. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Inbox Session Session Outbox Inbox Outbox Inbox
  • 10. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Inbox Session Session Outbox Inbox Outbox Inbox
  • 11. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Session Outbox Inbox Session Inbox Outbox Inbox Outbox
  • 12. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Session Outbox Inbox Session Inbox Outbox Inbox Outbox Inbox
  • 13. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Outbox SGA Session Outbox Inbox Inbox Outbox Outbox Outbox Inbox
  • 14. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Outbox SGA Session Outbox Inbox Inbox Outbox Outbox Outbox Inbox
  • 15. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Outbox SGA Session Outbox Inbox Inbox Outbox Outbox Outbox Inbox
  • 17. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); end pipe_demo;
  • 18. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); end pipe_demo;
  • 19. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); end pipe_demo;
  • 20. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 21. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 22. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 23. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log; pack_message (number) pack_message (varchar2) pack_message (date) pack_message_raw pack_message_rowid
  • 24. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 25. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ) is l_status number; begin l_status := dbms_pipe.receive_message(pipename => c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.receive_message failed with status ' || l_status); end if; dbms_pipe.unpack_message(o_user); dbms_pipe.unpack_message(o_sid); dbms_pipe.unpack_message(o_host); dbms_pipe.unpack_message(o_time); dbms_pipe.unpack_message(o_text); end get_next; end pipe_demo;
  • 26. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ) is l_status number; begin l_status := dbms_pipe.receive_message(pipename => c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.receive_message failed with status ' || l_status); end if; dbms_pipe.unpack_message(o_user); dbms_pipe.unpack_message(o_sid); dbms_pipe.unpack_message(o_host); dbms_pipe.unpack_message(o_time); dbms_pipe.unpack_message(o_text); end get_next; end pipe_demo;
  • 27. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ) is l_status number; begin l_status := dbms_pipe.receive_message(pipename => c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.receive_message failed with status ' || l_status); end if; dbms_pipe.unpack_message(o_user); dbms_pipe.unpack_message(o_sid); dbms_pipe.unpack_message(o_host); dbms_pipe.unpack_message(o_time); dbms_pipe.unpack_message(o_text); end get_next; end pipe_demo; unpack_message (number) unpack_message (varchar2) unpack_message (date) unpack_message_raw unpack_message_rowid
  • 28. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 29. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 30. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 31. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 32. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public static void processRequests(Connection connection) throws SQLException { String user; int sid; String host; Timestamp time; String text = " "; CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
  • 33. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public static void processRequests(Connection connection) throws SQLException { String user; int sid; String host; Timestamp time; String text = " "; CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
  • 34. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public static void processRequests(Connection connection) throws SQLException { String user; int sid; String host; Timestamp time; String text = " "; CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
  • 35. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 36. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 37. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 38. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 40. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 41. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 42. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 44. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 46. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon
  • 47. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ); end pipe_demo;
  • 48. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 49. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 51. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Session Session Session Session
  • 52. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 53. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 54. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo; There is also dbms_alert.waitany
  • 55. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo; There is also dbms_alert.removeall
  • 57. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 58. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox dbms_pipe.unique_session_name
  • 59. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon DBMS_PIPE DBMS_ALERT Type Named Pipes / Queue Signals / Broadcast Implementation SGA structure Table Transactional? Non-Transactional Transactional Consumers of a specific message Single Consumer Zero-to-Multiple Consumers Blocked Publisher? When pipe is full (“pipe put” wait event) When other session signaled to the same alert and hasn’t committed yet (TX lock), but only if there are registered consumers Possible Loss of Messages? Instance crash/shutdown Multiple signals to the same alert before read by the consumer