在 PL/SQL 中整合外部系統時,UTL_HTTP 套件是核心工具。使用前必須確保執行用戶擁有 NETWORK_ACL 權限(11g+ 需 DBMS_NETWORK_ACL_ADMIN 設定)。
CREATE OR REPLACE FUNCTION http_get(p_url IN VARCHAR2) RETURN CLOB IS
http_req UTL_HTTP.REQ;
http_resp UTL_HTTP.RESP;
l_raw RAW(1024);
l_resp CLOB;
BEGIN
http_req := UTL_HTTP.BEGIN_REQUEST(p_url, 'GET');
http_resp := UTL_HTTP.GET_RESPONSE(http_req, TRUE);
LOOP
UTL_HTTP.READ_RAW(http_resp, l_raw, 1024);
l_resp := l_resp || UTL_RAW.CAST_TO_VARCHAR2(l_raw);
END LOOP;
UTL_HTTP.END_RESPONSE(http_resp);
RETURN l_resp;
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN
UTL_HTTP.END_RESPONSE(http_resp);
RETURN l_resp;
END;
CREATE OR REPLACE FUNCTION http_post(
p_url IN VARCHAR2,
p_data IN VARCHAR2 -- 格式:a=1&b=2
) RETURN CLOB IS
http_req UTL_HTTP.REQ;
http_resp UTL_HTTP.RESP;
l_raw RAW(1024);
l_resp CLOB;
BEGIN
http_req := UTL_HTTP.BEGIN_REQUEST(p_url, 'POST');
UTL_HTTP.SET_HEADER(http_req, 'Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
UTL_HTTP.SET_HEADER(http_req, 'Content-Length', LENGTH(p_data));
UTL_HTTP.WRITE_TEXT(http_req, p_data);
http_resp := UTL_HTTP.GET_RESPONSE(http_req, TRUE);
LOOP
UTL_HTTP.READ_RAW(http_resp, l_raw, 1024);
l_resp := l_resp || UTL_RAW.CAST_TO_VARCHAR2(l_raw);
END LOOP;
UTL_HTTP.END_RESPONSE(http_resp);
RETURN l_resp;
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN
UTL_HTTP.END_RESPONSE(http_resp);
RETURN l_resp;
END;
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE 授權。UTL_URL.ESCAPE,回傳 CLOB 以支援大量資料。UTL_HTTP.SET_TRANSFER_TIMEOUT 避免卡死。UTL_HTTP.SET_WALLET 指定。