記一次用Oracle 訪問webservice接口,並解析soap報文和Json字符串

oracle 訪問webservice


```sql
--TRUNCATE TABLE table_temp
--SELECT * FROM TABLE_temp

DECLARE
  P_HTTP_URL      VARCHAR2(2000) := 'http://10.5.0.136:89/Service/Service.asmx';
  P_METHOD        VARCHAR2(20) := 'GetEmpData';
  P_REQUEST_DATA  VARCHAR2(4000) := '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
   <soap:Header/>
   <soap:Body>
      <tem:GetEmpData>
         <tem:pwd>xxxxx</tem:pwd>
         <tem:companyid>xxxxx</tem:companyid>
      </tem:GetEmpData>
   </soap:Body>
</soap:Envelope>';
  L_HTTP_REQUEST  UTL_HTTP.REQ;
  L_HTTP_RESPONSE UTL_HTTP.RESP;
  L_BUFFER        VARCHAR2(2000) := '';
  L_DATA          CLOB; --緩存未解析數據
  L_CURR          CLOB; --過渡用的 
  L_ID            NUMBER := 5;
  RS              CLOB; --解析後的數據
  -------解析json相關
  X_LEN       NUMBER;
  X_AMOUNT    NUMBER := 1000;
  X_OFFSET    NUMBER := 1;
  X_BUFFER    VARCHAR2(4000);
  X_STEP      NUMBER := 2;
  X_ID        NUMBER := 0;
  X_JSONARRAY VARCHAR2(4020);

  J_LEN NUMBER := 0;
BEGIN
  BEGIN
    --// 構造請求體
    L_HTTP_REQUEST := UTL_HTTP.BEGIN_REQUEST(P_HTTP_URL, 'POST', 'HTTP/1.1');
    UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,
                        'Content-Type',
                        'text/xml; charset=utf-8');
    UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,
                        'Content-Length',
                        LENGTH(P_REQUEST_DATA));
    UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,
                        'SOAPAction',
                        'http://tempuri.org/' || P_METHOD);
    UTL_HTTP.WRITE_TEXT(L_HTTP_REQUEST, P_REQUEST_DATA);
    --得到返回結果
    L_HTTP_RESPONSE := UTL_HTTP.GET_RESPONSE(L_HTTP_REQUEST);
    
    DBMS_LOB.CREATETEMPORARY(L_DATA, FALSE); --創建一個緩存的CLOB對象
    LOOP
      --將L_HTTP_RESPONSE轉爲clob
      UTL_HTTP.READ_TEXT(L_HTTP_RESPONSE, L_BUFFER);
      --替換這些信息很重要!!!不替換後面解析不出數據
      L_BUFFER := REPLACE(L_BUFFER, 'soapenv:', '');
      L_BUFFER := REPLACE(L_BUFFER, 'soap:', '');
      L_BUFFER := REPLACE(L_BUFFER,
                          'xmlns:soap="http://www.w3.org/2003/05/soap-envelope"',
                          '');
      L_BUFFER := REPLACE(L_BUFFER,
                          'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"',
                          '');
      L_BUFFER := REPLACE(L_BUFFER,
                          'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
                          '');
      L_BUFFER := REPLACE(L_BUFFER,
                          'xmlns:xsd="http://www.w3.org/2001/XMLSchema"',
                          '');
      L_BUFFER := REPLACE(L_BUFFER, 'xmlns="http://tempuri.org/"', '');
      L_CURR   := L_BUFFER; --轉換爲clob
      DBMS_LOB.APPEND(L_DATA, L_CURR); --追加數據
    
    END LOOP;
  EXCEPTION
    WHEN UTL_HTTP.END_OF_BODY THEN
      --釋放資源
      UTL_HTTP.END_RESPONSE(L_HTTP_RESPONSE);
    WHEN OTHERS THEN
      RAISE;
  END;
  --DBMS_OUTPUT.PUT_LINE(DBMS_LOB.GETLENGTH(L_DATA));
  --UTL_HTTP.END_RESPONSE(L_HTTP_RESPONSE);
  --DBMS_LOB.CREATETEMPORARY(RS, TRUE);
  --SELECT text INTO RESPONSE_XML FROM table_temp WHERE ID=L_ID;
  SELECT XM
    INTO RS
    FROM XMLTABLE('$C/Envelope/Body/GetEmpDataResponse' PASSING
                  XMLTYPE(L_DATA) AS C COLUMNS XM CLOB PATH
                  '//GetEmpDataResult/text()');
  DBMS_OUTPUT.PUT_LINE(DBMS_LOB.GETLENGTH(RS));
  /*---------解析json----------------------*/
  --讀取數據到緩衝區
  J_LEN := DBMS_LOB.GETLENGTH(RS);
  
  BEGIN
  
    LOOP
      DBMS_LOB.READ(RS, X_AMOUNT, X_STEP, X_BUFFER);
      X_ID     := INSTR(X_BUFFER, '}', -1);
      X_BUFFER := SUBSTR(X_BUFFER, 0, X_ID);
      X_STEP   := X_STEP + LENGTH(X_BUFFER) + 1;
      --拼接爲json數組
      X_JSONARRAY := '[' || X_BUFFER || ']';
      --釋放緩存
      X_BUFFER := NULL;
      J_LEN    := JSONPKG.GETARRLEN(X_JSONARRAY)-1;
    
      FOR K IN 0 .. J_LEN LOOP
        X_BUFFER := JSONPKG.GETARRVAL(X_JSONARRAY, K);
        --DBMS_OUTPUT.PUT_LINE(JSONPKG.GETVAL(JSONPKG.GETARRVAL(X_JSONARRAY, K),'Name'));
        INSERT INTO EHR_USER
          (WORKID,
           USERNAME,
           EMAIL,
           DEPTID,
           WORKSTATUS,
           DATEIN,
           DATEOUT,
           TEL,
           COMPANY_ID)
        VALUES
          (JSONPKG.GETVAL(X_BUFFER, 'Workid'),
           JSONPKG.GETVAL(X_BUFFER, 'Name'),
           JSONPKG.GETVAL(X_BUFFER, 'Email'),
           JSONPKG.GETVAL(X_BUFFER, 'Deptid'),
           JSONPKG.GETVAL(X_BUFFER, 'Workstatus'),
           JSONPKG.GETVAL(X_BUFFER, 'DateIn'),
           JSONPKG.GETVAL(X_BUFFER, 'DateOut'),
           JSONPKG.GETVAL(X_BUFFER, 'tel'),
           JSONPKG.GETVAL(X_BUFFER, 'CompanyID'));
        COMMIT;
      END LOOP;
      EXIT WHEN X_STEP >= X_LEN;
    END LOOP;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      null;
  END;
  X_BUFFER := NULL;
  DBMS_LOB.FREETEMPORARY(L_DATA); --釋放緩存
  DBMS_LOB.FREETEMPORARY(RS); --釋放緩存
EXCEPTION
  WHEN OTHERS THEN
  
    UTL_TCP.CLOSE_ALL_CONNECTIONS;
    RAISE;
  
END;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章