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

    --------------------------------------

 

  

posted on 2015-10-29 12:53  沈恩忍  阅读(378)  评论(0编辑  收藏  举报

导航