/*
    PL/SQL sample for HTTP access (Oracle 11g R2)

1. Execute /u01/app/oracle/product/11.2.0/xe/rdbms/admin/utlhttp.sql to use UTL_HTTP package
   Run the following command in shell in the DB server
    $ cd /u01/app/oracle/product/11.2.0/xe/rdbms/admin/
    $ sqlplus SYS/passwd@localhost:1521/XE AS SYSDBA @utlhttp.sql

2. Grant the connect and resolve privileges for all hosts to the user 'SCOTT'
   Run the following commands in SQL*Plus

    BEGIN
        DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('www.xml', 'WWW ACL', 'SCOTT', TRUE, 'connect');
        DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('www.xml', 'SCOTT', TRUE, 'resolve');

        -- All
        DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('www.xml', '*');
    END;

  See:
    http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm
    http://www.oracleflash.com/36/Oracle-11g-Access-Control-List-for-External-Network-Services.html
    http://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_networkacl_adm.htm (ja)

3. Execute this script
    $ sqlplus SCOTT/TIGER@localhost:1521/XE @PLSQL_WWW_GET_SAMPLE.sql
*/
CREATE TABLE WWW_DATA (num NUMBER, dat CLOB)
/
CREATE OR REPLACE PROCEDURE WWW_GET(url VARCHAR2)
IS
    request UTL_HTTP.REQ;
    response UTL_HTTP.RESP;
    n NUMBER;
    buff VARCHAR2(4000);
    clob_buff CLOB;
BEGIN
    UTL_HTTP.SET_RESPONSE_ERROR_CHECK(FALSE);
    request := UTL_HTTP.BEGIN_REQUEST(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
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
                DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
                UTL_HTTP.END_RESPONSE(response);
        END;

	SELECT COUNT(*) + 1 INTO n FROM WWW_DATA;
        INSERT INTO WWW_DATA VALUES (n, clob_buff);
        COMMIT;
    ELSE
        DBMS_OUTPUT.PUT_LINE('ERROR');
        UTL_HTTP.END_RESPONSE(response);
    END IF;
  
END;
/
SHOW ERRORS
/
-- Get Twitter public timeline (XML)
EXEC WWW_GET('http://api.twitter.com/1/statuses/public_timeline.xml')
/
-- Get Twitter public timeline (JSON)
EXEC WWW_GET('http://api.twitter.com/1/statuses/public_timeline.json')
/
QUIT;

