Java stored procedure in Oracle

  • 示例环境配置

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

  • 用 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; 
    } 
}
  • 创建一个 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';
  • 在远程机器上启动一个 UDP 的接收程序检测来自数据库的包

  • 在 Command Window 中测试这个方法

set serveroutput on size 10000 
exec dbms_java.set_output(10000) 
exec DBMS_OUTPUT.PUT_LINE(fn_send_udp_message('Hello ABC'));
  • 检查是否收到来自 Oracle Java Stored Procedure 的消息

若接收到则表示成功,否则调试失败原因。

可能存在的问题:
权限相关

解决方法:
根据提示添加相关权限