PL/SQL 调用JAVA使用UDP发送数据
步骤如下
1.直接在SQL命令中写入JAVA代码(用SYS帐号执行,不然权限等太麻烦)
create or replace and resolve java source named udp as import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class udp { /* public static void main(String[] args){ udp.send("192.168.0.110","514","java 1.5 send successfully!"); } */ public static String send(String ip,String port,String msg){ try{ int int_port=Integer.parseInt(port); //字符转整形 DatagramSocket ds = new DatagramSocket(); DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.length(), InetAddress.getByName(ip), int_port); ds.send(dp); ds.close(); //关闭连接 return "Successfully"; }catch(Exception e){ return "Failed"; } } }
-----------------------------------------------------------------------------------
提示:
或者先用JAVAC编译完JAVA代码,再用 loadjava 命令上传
C:\>javac udp.java
/*dbadmin 为数据库管理员权限(普通权限也可以)*/
C:\>loadjava -user dbadmin/password@sid -o -v -f -r c:\udp.class
//此步骤如同使用 create or replace and resolve java source named udp 。。。一样。
------------------------------------------------------------------------------------
2.编写调用JAVA的包或方法
--包头 create or replace package udp is function send( p_ip in varchar2,--目标IP地址 p_port in varchar2,--目标端口号 p_msg in varchar2 --发送消息内容 ) return varchar2; --成功返回 Successfully,否则返回其他 end udp; / --包体 create or replace package body udp is function send( p_ip in varchar2,--目标IP地址 p_port in varchar2,--目标端口号 p_msg in varchar2 --发送消息内容 ) return varchar2 is language java name 'udp.send(java.lang.String,java.lang.String,java.lang.String) return java.lang.String'; end udp;
------------------------------------------------------------------
提示:
使用 PLSQL 方法也可以,如下
function send( p_ip in varchar2,--目标IP地址 p_port in varchar2,--目标端口号 p_msg in varchar2 --发送消息内容 ) return varchar2 is language java name 'udp.send(java.lang.String,java.lang.String,java.lang.String) return java.lang.String';
------------------------------------------------------------------
3.把 udp 包授权给普通用户,普通用户就可以使用了。
在SQL输入命令(使用SYS帐号),如下
GRANT EXECUTE ON udp TO USERNAME;
------------------------------------------------------------------
提示
如果出现网络等错误,可用如下代码解决(用SYS 帐输入,如下代码)
begin dbms_network_acl_admin.create_acl ( acl => 'UTL_INADDR.xml', description => 'utl_inaddr', principal => 'USERNAME', --此为将来要进行操作的用户 is_grant => TRUE, privilege => 'resolve' ); commit; end; / begin dbms_network_acl_admin.add_privilege ( acl => 'UTL_INADDR.xml', principal => 'USERNAME', is_grant => true, privilege => 'connect' ); commit; end; / begin dbms_network_acl_admin.assign_acl( acl => 'UTL_INADDR.xml', host => '*' ); commit; end; / exec sys.dbms_java.grant_permission( 'USERNAME', 'SYS:java.net.SocketPermission', '192.168.1.110:514', 'connect,resolve' );
------------------------------------------------------------------
4.使用
declare l_res varchar2(100); begin l_res:=udp.send('192.168.0.10','1234','我是将要发送的内容'); if upper(l_res)='SUCCESSFULLY' then htp.print('发送成功!'); else htp.print('发送失败!'); end if; end;
---------------------------------------
提示,如果这些代码日后不使用了,可用如下方法删除
1.删除包
drop package udp;
2.删除java
drop java source udp;
如果用 loadjava 上传的,可用
drop java class udp;
或在命令提示符下输入如下代码
dropjava -u dbadmin/password@sid001 udp.class
--------------------------------------