Oracle使用Java发送短信

前端之家收集整理的这篇文章主要介绍了Oracle使用Java发送短信前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

项目上要求使用Oracle加载Java类,发送短信息。当向msg表新增记录时就使用java类发送短信息,接收返回值并更新记录的时间及结果。

分析:

  1. msg表新增记录就发送短信息,此处使用触发器最好。
  2. 接收返回值更新对应的记录,因此使用 before insert。因为after是不可以更新:new.[字段名]的。
  3. 触发器调用Java方法接收返回值,此处使用Oracle的Function,为Java方法建立Function

实现:

Oracle JavaSource
目前仅使用了两种方式加载Java

  1. 使用Oracle loadjava
    loadjava -user test/test@test -o -v -f -r Msg_HttpRequest.java
  2. 使用pl/sql 直接创建
    代码如下
create or replace and compile java source named "Msg_HttpRequest" as
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

public class Msg_HttpRequest {

     public static String sendPost(String mobile,String content) {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            try {
                if("".equals(mobile)||"".equals(content)){return "有空值";}
                URL realUrl = new URL("短信URL");
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 设置通用的请求属性
                conn.setRequestProperty("accept","*/*");
                conn.setRequestProperty("connection","Keep-Alive");
                conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // 获取URLConnection对象对应的输出
                out = new PrintWriter(conn.getOutputStream());
                // 发送请求参数
                StringBuilder param = new StringBuilder();
                param.append("corpId=短信平台秘钥&");
                param.append("secretKey=秘钥&");
                param.append("mobile="+mobile+"&");
                param.append("content=").append(URLEncoder.encode(content,"UTF-8"));
                out.print(param.toString());
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送 POST 请求出现异常!"+e);
                e.printStackTrace();
                result=e.toString();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result;
        }


}
create or replace and compile java source named "Msg_run" as
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class Msg_run {
  public static String mainConn(String user_mobile,String msg_content) {


      try {
    // if("".equals(user_mobile)||"".equals(msg_content)){return "0";}
    Msg_HttpRequester request = new Msg_HttpRequester();

    String result = request.sendPost(user_mobile,msg_content)
    System.out.println(result);
        return result;
      } catch (Exception e) {
        e.printStackTrace();
         return "1";
      }
  }
}

创建Function

create or replace function f_send( user_mobile varchar2,msg_contend varchar2)  return varchar2 as
language java name 'Msg_run.mainConn(java.lang.String,java.lang.String) return java.lang.String';

可以使用如下进行测试

select f_send('','') from dual;

具体使用触发器调用函数就不再粘代码了。

问题:

这一套流程下来,遇见几个问题

  1. 权限问题
    为Oracle用户使用短信调用地址赋权
    使用本地账户DBA权限,和SYS /as sysdba都使用过均显示成功。

    exec dbms_java.grant_permission( 'SLAB','SYS:java.net.SocketPermission','localhost:1024-','listen,resolve');
    exec dbms_java.grant_permission( 'SLAB','accept,‘connect,resolve');

    使用赋权后,再测试f_send(),发现还是报没有权限的问题。
    需要等待一段时间,这一点始终没有明白。
    有一个怀疑是Java会话问题。
    希望有人可以给解答。
    参考:https://community.oracle.com/thread/726719?tstart=0

  2. Java方法中创建Connect到Oracle
    不需要再使用JDBC加载Class了
    Connection conn = DriverManager.getConnection("jdbc:default:connection:");
原文链接:https://www.f2er.com/oracle/213832.html

猜你在找的Oracle相关文章