oracle实时调用java http接口
当表中insert时,触发器调用存储过程,存储过程调用java http
备注:(plsql普通用户登陆创建java source)
新建java source,代码:
create or replace and compile java source named jym as
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class JYM {
public static void sendGet(String url,String title){
String result ="";
BufferedReader in = null;
try{
String urlName = url+"?title="+title;
URL realUrl = new URL(urlName);
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.connect();
in= new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while((line = in.readLine())!=null){
result += "/n"+line;
}
}catch(Exception e){
System.out.println("发送GET请求出现异常"+e);
e.printStackTrace();
}
finally{
try{
if(in !=null){
in.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
带返回值和不带返回值的方法请查看具体创建存储过程的方法
代码如下:
create or replace procedure lqHttp(ip varchar2,title varchar2)
as language java name
'JYM.sendGet(java.lang.String,java.lang.String)';
创建表:
create table message_notion(
id number(2),
name varchar2(20),
title varchar2(20)
)
插入:
insert into message_notion (id,name,title) values (89,'lihq','test');
创建触发器:
create or replace trigger insterMessageNotionAfter
after insert on message_notion
for each row
begin
lqHttp('http://ip:端口号/Sp/helloworld',:new.title);
end insterMessageNotionAfter;
备注:ip+端口号 必须要oracle能访问到ip,我这边是oracle单独服务器,项目单独服务器,必须开启端口权限,可以访问。
insert一条数据:
insert into message_notion (id,name,title) values (9,'lihq','test');
查看接口没有接收到数据,这个是因为oracle访问网络通信需要添加ACl控制权限。
切换登陆名,用sys登陆plsql ,开始添加ACL网络权限:
BEGIN
dbms_network_acl_admin.create_acl(acl => 'lhqhttp.xml',
DESCRIPTION => 'Normal Access',
principal => 'SCOTT',
is_grant => TRUE,
PRIVILEGE => 'connect',
start_date => NULL,
end_date => NULL);
END;
principal :用户名,刚才添加java source和触发器的用户名
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
is_grant :表示有权限
begin dbms_network_acl_admin.add_privilege(acl => 'lhqhttp.xml',
principal => 'SCOTT',
is_grant => TRUE,
privilege => 'connect',
start_date => null,
end_date => null);
end;
begin
dbms_network_acl_admin.assign_acl(acl => 'lhqhttp.xml',
host => '120.78.212.39',
lower_port => 80,
upper_port => NULL);
end;
这三步执行完之后,查看ACl控制权限
SELECT any_path
FROM resource_view
where any_path like '/sys/acls/%.xml';
SELECT acl,
principal,
privilege,
is_grant,
TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
FROM dba_network_acl_privileges;
用SCOTT用户执行insert。
如果能查看到则正常,打不开可以直接执行上边insert数据,看看接口是否调用成功。
我添加了ACL控制权限接口调用成功,但是sql查询权限一直看不到acl,不知道是不是没有重启的原因。
代码下载链接:
oracle和java代码
(积分自动设置5,不知道咋回事,需要的朋友可以留言)