Oracle数据库对接WebAPI接口并解析JSON

CREATE OR REPLACE PROCEDURE Get_Mall_Customer_Balance(Xv_Ret_Status     OUT VARCHAR2
                                                     ,Xv_Ret_Message    OUT VARCHAR2
                                                     ,Xn_Cust_Balance   OUT NUMBER
                                                     ,Pn_Org_Id         IN NUMBER
                                                     ,Pn_Cust_Acct_Id   IN NUMBER
                                                     ,Pn_Bussiness_Flag IN NUMBER) IS

  -- 常量定义
  Lv_Proc_Name  CONSTANT VARCHAR2(50) := 'Refund_Validate_From_Mall'; -- 方法名
  Lv_Webapi_Url CONSTANT VARCHAR2(240) := 'http://xxx.xxx.xx.x:7001/ErpWsApp/jersey/ErpWsAppService/ErpGetCustomerBalance'; --WebAPI

  -- 变量定义
  Lv_Para_Content   VARCHAR2(1000);
  Lraw_Para_Content RAW(32767);
  Req               Utl_Http.Req;
  Resp              Utl_Http.Resp;
  Lv_Replyline      VARCHAR2(4000);
  Lv_Respond        VARCHAR2(32767); --返回报文
  Lj_Respond        Json;
  --
  Lv_Count      VARCHAR2(30);
  Lv_Status     VARCHAR2(30);
  Lv_Msg        VARCHAR2(30);
  Array_Data    Json_List;
  Jsonobj       Json;
  Lv_Meaning    VARCHAR2(30);
  Lv_Ebscustid  VARCHAR2(30);
  Lv_Lineamount VARCHAR2(30);

BEGIN
  ------------
  -- 初始化变量
  ------------
  Xv_Ret_Status  := Fnd_Api.g_Ret_Sts_Success; -- 返回状态
  Xv_Ret_Message := NULL; -- 返回消息

  --接口参数串拼接
  Lv_Para_Content := '{"OU_ID":"' || Pn_Org_Id || '","EBS_CUST_ID":"' || Pn_Cust_Acct_Id ||
                     '","BUSINESS_FLAG":"' || Pn_Bussiness_Flag || '"}';

  --Lv_Para_Content := '{"OU_ID":"130","EBS_CUST_ID":"4040","Business_Flag":"4"}';

  -----------
  --主程序开始
  -----------
  Utl_Http.Set_Transfer_Timeout(300);

  Req := Utl_Http.Begin_Request(Lv_Webapi_Url --地址URL
                               ,'POST' --调用方式
                               ,Utl_Http.Http_Version_1_1); --http_version调用版本

  -- 保持连接状态
  Utl_Http.Set_Persistent_Conn_Support(Req, TRUE);

  --设置编码
  Utl_Http.Set_Header(Req, 'Content-Type', 'application/json;charset=UTF-8');
  Utl_Http.Set_Header(Req, 'Content-Length', Length(Lv_Para_Content));
  --
  Utl_Http.Write_Text(Req, Lv_Para_Content); --通过body发送消息
  --
  Resp := Utl_Http.Get_Response(Req);

  IF (Resp.Status_Code = Utl_Http.Http_Ok) THEN
    --
    BEGIN
      LOOP
        Utl_Http.Read_Line(Resp, Lv_Replyline, TRUE);
        Lv_Respond := Lv_Respond || Lv_Replyline;
      END LOOP;
      Utl_Http.End_Response(Resp);
    EXCEPTION
      WHEN Utl_Http.End_Of_Body THEN
        Utl_Http.End_Response(Resp);
    END;
  
  ELSE
    Xv_Ret_Status  := Fnd_Api.g_Ret_Sts_Error; -- 返回状态
    Xv_Ret_Message := '接口调用异常' || SQLERRM; -- 返回消息
  END IF;

  --开始解析返回的Json串
  Lj_Respond := Json(Lv_Respond);
  --获取第一层json值
  Lv_Count  := Json_Ext.Get_String(Lj_Respond, 'count');
  Lv_Status := Json_Ext.Get_String(Lj_Respond, 'status');
  Lv_Msg    := Json_Ext.Get_String(Lj_Respond, 'msg');
  --
  Array_Data := Json_List();
  Array_Data := Json_Ext.Get_Json_List(Lj_Respond, 'data');
  --
  FOR i IN 1 .. Array_Data.Count LOOP
    --
    Jsonobj := Json(Array_Data.Get(i));
    --
    Lv_Meaning    := Json_Ext.Get_String(Jsonobj, 'Meaning');
    Lv_Ebscustid  := Json_Ext.Get_String(Jsonobj, 'EbsCustId');
    Lv_Lineamount := Json_Ext.Get_String(Jsonobj, 'LineAmount');
  END LOOP;
  --
  Xn_Cust_Balance := To_Number(Lv_Lineamount);
EXCEPTION
  WHEN OTHERS THEN
    Xv_Ret_Status  := Fnd_Api.g_Ret_Sts_Error;
    Xv_Ret_Message := Lv_Proc_Name || '时发生异常:' || SQLERRM;
    --
    Xn_Cust_Balance := 0;
  
END;

原文地址:https://www.cnblogs.com/ruicccc/p/13227702.html