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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| CREATE OR REPLACE PROCEDURE DBA_Check_URL_Status(t_url in varchar2) IS request UTL_HTTP.REQ; response UTL_HTTP.RESP; v_url varchar2(4000); v_ck_txt varchar2(4000); clob_buff CLOB; buff VARCHAR2(4000); v_seq number ; V_MSG varchar2(4000); V_USER_FROM varchar2(4000); c utl_tcp.connection; -- TCP/IP connection to the Web server ret_val pls_integer; v_temp varchar2 (1000); BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE= ''AMERICAN'''; v_url := t_url; v_ck_txt := null; if instr(lower(v_url),'https:') > 0 then --處理HTTPS select REGEXP_SUBSTR(REGEXP_REPLACE(v_url,'^http[s]?://','',1),'[a-z,A-Z,0-9,-]+(\.\w+)+') INTO v_temp from dual; BEGIN c := utl_tcp.open_connection(remote_host => v_temp, remote_port => 443, tx_timeout => 5, charset => 'UTF-8'); -- open connection ret_val := utl_tcp.write_line(c, 'GET / HTTP/1.1'); -- send HTTP request ret_val := utl_tcp.write_line(c); BEGIN LOOP dbms_output.put_line(utl_tcp.get_line(c, TRUE)); -- read result END LOOP; EXCEPTION WHEN utl_tcp.end_of_input THEN dbms_output.put_line('Check_SSL_URL_OK End'); -- read result END; utl_tcp.close_connection(c); EXCEPTION WHEN OTHERS THEN --記錄錯誤和簡訊通知 END; else BEGIN --處理HTTP UTL_HTTP.SET_RESPONSE_ERROR_CHECK(FALSE); request := UTL_HTTP.BEGIN_REQUEST(v_url, 'GET'); UTL_HTTP.SET_HEADER(request, 'User-Agent', 'Mozilla/4.0'); response := UTL_HTTP.GET_RESPONSE(request); DBMS_OUTPUT.PUT_LINE('HTTP response status code: ' || response.status_code); IF response.status_code = 200 THEN BEGIN clob_buff := EMPTY_CLOB; LOOP UTL_HTTP.READ_TEXT(response, buff, LENGTH(buff)); clob_buff := clob_buff || buff; END LOOP; UTL_HTTP.END_RESPONSE(response); EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(response); WHEN OTHERS THEN --記錄錯誤和簡訊通知 END; --DBMS_OUTPUT.PUT_LINE(clob_buff); v_ck_txt := substr(clob_buff,1,2000); v_ck_txt := trim(v_ck_txt); IF instr(v_ck_txt,'ORA-') > 0 THEN --記錄錯誤和簡訊通知 elsif length(v_ck_txt)=1 and v_ck_txt||''='1' then --判讀回傳特定值就視為正確 else --記錄錯誤和簡訊通知 END IF; ELSE --記錄錯誤和簡訊通知 UTL_HTTP.END_RESPONSE(response); END IF; EXCEPTION WHEN Utl_Http.request_failed THEN v_ck_txt := substr(Utl_Http.get_detailed_sqlerrm,1,100); --記錄錯誤和簡訊通知 END; end if; END; /
|