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;