本文作出如下假设:
1)Oracle 版本 11.2g
2)使用 PL/SQL Developer
3)Oracle 所在 IP 192.168.56.222
4)远程机器 IP 192.168.56.1
5)Java 存储过程使用本地 UDP 端口 7777
6)远程检测程序使用 UDP 端口 7778
完整步骤如下:
1. 用 PL/SQL 创建一个 Java Source 类 UDPSender,并编译到数据库。
create or replace and compile java source named UDPSender as import java.net.*; public class UDPSender { // local IP address static final String LOCAL_IP_ADDR = "192.168.56.222"; // remote IP address static final String REMOTE_IP_ADDR = "192.168.56.1"; // UDP Socket Port static final int LOCAL_UDP_PORT = 7777; // UDP Socket Port static final int REMOTE_UDP_PORT = 7778; // Send UDP Message public static String send(String msg) { String retmsg = "UDPSender send msg: " + msg; DatagramSocket sock = null; try { retmsg += " -> Create a UDP socket."; sock = new DatagramSocket( LOCAL_UDP_PORT, InetAddress.getByName(LOCAL_IP_ADDR) ); DatagramPacket p = new DatagramPacket( msg.getBytes(), msg.length(), InetAddress.getByName(REMOTE_IP_ADDR), REMOTE_UDP_PORT ); sock.send(p); retmsg += " -> Sent Ok.\n"; sock.close(); } catch (Exception e) { e.printStackTrace(); retmsg += " -> Exception: " + e.toString(); } return retmsg; } } |
2. 创建一个 SQL 函数引用这个 Java 方法
create or replace function fn_send_udp_message (msg in nvarchar2) return nvarchar2 as language java name 'UDPSender.send(java.lang.String) return java.lang.String'; |
3. 在远程机器上启动一个 UDP 的接收程序检测来自数据库的包
自己编写
4. 在 Command Window 中测试这个方法
set serveroutput on size 10000 exec dbms_java.set_output(10000) exec DBMS_OUTPUT.PUT_LINE(fn_send_udp_message('Hello ABC')); |
5. 检查是否收到来自 Oracle Java Stored Procedure 的消息
若接收到则表示成功。
否则调试失败原因。
可能存在的问题:
权限相关
解决方法:
根据提示添加相关权限