小强

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Oracle 通过UTL_HTTP包发送http请求调用webapi

1、利用ORACLE中UTL_HTTP包提供的BEGIN_REQUEST方法发起请求。

CREATE OR REPLACE PROCEDURE P_DT_gettoken(v_corpid in varchar2,v_corpsecret in varchar2 ) IS
  req  UTL_HTTP.REQ;
  resp UTL_HTTP.RESP;
  v_text  varchar2(10000);
  xmlstr  varchar2(30000);
  errmsg  varchar2(100);
  url  varchar2(100);
  access_token  varchar2(100);
begin
    --正常情况下access_token有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。
    begin
      select F_DT_URL() into url from dual;
      req  := UTL_HTTP.BEGIN_REQUEST(url || '/api/DingTalk/gettoken?corpid='|| v_corpid || '&' || 'corpsecret='|| v_corpsecret );
      utl_http.set_header(req, 'Content-Type', 'text/html; charset=utf-8');
      utl_http.write_text(req,xmlstr); --通过body发送消息;
      resp := UTL_HTTP.GET_RESPONSE(req);

      LOOP
        UTL_HTTP.read_line(resp,v_text, TRUE);
        --获取返回json中errmsg的值 {"expires_in":7200,"errmsg":"ok","access_token":"76a94aff8a4c3d","errcode":0}
        select parsejson(v_text,'errmsg') into errmsg from dual;
        --dbms_output.put_line(errmsg);
        IF errmsg = 'ok' THEN
           select parsejson(v_text,'access_token') into access_token from dual;
           delete DT_INFO;
           insert into DT_INFO (errmsg,access_token) values (errmsg,access_token);
        ELSE
           delete DT_INFO;
           insert into DT_INFO (errmsg) values (errmsg);
        END IF;

      END LOOP;
      utl_http.end_request(req);
      utl_http.end_response(resp);
    EXCEPTION
      WHEN utl_http.end_of_body THEN
        utl_http.end_response(resp);
        WHEN OTHERS THEN
      utl_http.end_response(resp);
      utl_http.end_request(req);
    end;
END P_DT_gettoken;

2、Oracle中JSON处理函数

CREATE OR REPLACE TYPE ty_row_str_split  as object (strValue VARCHAR2 (4000));
CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split;
CREATE OR REPLACE FUNCTION fn_split(p_str       IN VARCHAR2,
                                    p_delimiter IN VARCHAR2)
  RETURN ty_tbl_str_split IS
  j         INT := 0;
  i         INT := 1;
  len       INT := 0;
  len1      INT := 0;
  str       VARCHAR2(4000);
  str_split ty_tbl_str_split := ty_tbl_str_split();
BEGIN
  len  := LENGTH(p_str);
  len1 := LENGTH(p_delimiter);


  WHILE j < len LOOP
    j := INSTR(p_str, p_delimiter, i);


    IF j = 0 THEN
      j   := len;
      str := SUBSTR(p_str, i);
      str_split.EXTEND;
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);


      IF i >= len THEN
        EXIT;
      END IF;
    ELSE
      str := SUBSTR(p_str, i, j - i);
      i   := j + len1;
      str_split.EXTEND;
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
    END IF;
  END LOOP;


  RETURN str_split;
END fn_split;

CREATE OR REPLACE FUNCTION parsejson(p_jsonstr varchar2,p_key varchar2) RETURN VARCHAR2
IS
  rtnVal VARCHAR2(1000);
  i NUMBER(2);
  jsonkey VARCHAR2(500);
  jsonvalue VARCHAR2(1000);
  json VARCHAR2(3000);
BEGIN
  IF p_jsonstr IS NOT NULL THEN
     json := REPLACE(p_jsonstr,'{','') ;
     json := REPLACE(json,'}','') ;
     json := replace(json,'"','') ;
     FOR temprow IN(SELECT strvalue AS VALUE FROM TABLE(fn_split(json, ','))) LOOP
        IF temprow.VALUE IS NOT NULL THEN
           i := 0;
           jsonkey := '';
           jsonvalue := '';
           FOR tem2 IN(SELECT strvalue AS VALUE FROM TABLE(fn_split(temprow.value, ':'))) LOOP
               IF i = 0 THEN
                  jsonkey := tem2.VALUE;
               END IF;
               IF i = 1 THEN
                  jsonvalue := tem2.VALUE;
               END IF;

               i := i + 1;
           END LOOP;

           IF(jsonkey = p_key) THEN
               rtnVal := jsonvalue;
           END if;
        END IF;
     END LOOP;
  END IF;
  RETURN rtnVal;
END parsejson;


 

posted on   搬砖狗-小强  阅读(611)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示