CREATE OR REPLACE PROCEDURE RSS_FEED_READER ( i_url IN VARCHAR2 ) AS --============ TYPEs/VARIABLEs =============================================== TYPE rss_type IS RECORD ( title VARCHAR2(2000), link VARCHAR2(200), pubDate VARCHAR2(200), category VARCHAR2(500), description VARCHAR2(4000) ); v_rss_item rss_type; v_rss_empty_item rss_type; -- v_rss_item初期化用
v_url VARCHAR2(32767);
-- XML PARSER v_myParser DBMS_XMLPARSER.Parser;
-- XMLDOM v_rssDoc DBMS_XMLDOM.DomDocument;
-- for UTL_HTTP v_req UTL_HTTP.REQ; v_resp UTL_HTTP.RESP; v_source VARCHAR2(1024);
-- RSSソース用CLOB(SYS.XMLTYPE型にしたほうがよかったかもしれないが、現時点ではCLOBで!) v_tempClob CLOB;
--========== Internal PROCEDUREs/FUNCTIONs =================================== -- --**************************************************************************** --* VARCHAR2の文字列を最大で255文字または、改行コード毎にプリントする内部プロシージャ --**************************************************************************** -- PROCEDURE println ( i_text IN VARCHAR2 ) IS v_src VARCHAR2(32767); v_tempStr VARCHAR2(32767); BEGIN v_src := i_text; IF INSTR(v_src, UTL_TCP.CRLF) <> 0 THEN v_tempStr := SUBSTR(v_src, 1, INSTR(v_src, UTL_TCP.CRLF)-1); v_src := SUBSTR(v_src, INSTR(v_src, UTL_TCP.CRLF)+LENGTH(UTL_TCP.CRLF)); ELSE v_tempStr := v_src; END IF;
WHILE v_tempStr IS NOT NULL LOOP IF LENGTH(v_tempStr)> 255 THEN FOR i IN 1..(TRUNC(LENGTH(v_tempStr)/255)+1) LOOP DBMS_OUTPUT.PUT_LINE(SUBSTR(v_tempStr,1+ 255*(i-1),255)); END LOOP; ELSE DBMS_OUTPUT.PUT_LINE(v_tempStr); END IF;
IF INSTR(v_src, UTL_TCP.CRLF) <> 0 THEN v_tempStr := SUBSTR(v_src, 1, INSTR(v_src, UTL_TCP.CRLF)-1); v_src := SUBSTR(v_src, INSTR(v_src, UTL_TCP.CRLF)+LENGTH(UTL_TCP.CRLF)); ELSE EXIT; END IF; END LOOP;
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'println(VARCHAR2) internal procedure:' || sqlerrm() ); RAISE; END println;
--**************************************************************************** --* CLOBの文字列を最大で255文字または、改行コード毎にプリントする内部プロシージャ --**************************************************************************** -- PROCEDURE println ( i_text IN CLOB ) IS v_src CLOB; v_tempStr CLOB; BEGIN v_src := i_text; IF INSTR(v_src, UTL_TCP.CRLF) = 0 THEN v_src := REPLACE(v_src, '><', '>'||UTL_TCP.CRLF||'<'); END IF;
v_tempStr := SUBSTR(v_src, 1, INSTR(v_src, UTL_TCP.CRLF)-1); v_src := TRIM(LEADING UTL_TCP.CRLF FROM SUBSTR(v_src, INSTR(v_src, UTL_TCP.CRLF)));
WHILE v_tempStr IS NOT NULL LOOP IF LENGTH(v_tempStr) > 255 THEN FOR i IN 1..(TRUNC(LENGTH(v_tempStr)/255)+1) LOOP DBMS_OUTPUT.PUT_LINE(SUBSTR(v_tempStr,1+ 255*(i-1),255)); END LOOP; ELSE DBMS_OUTPUT.PUT_LINE(v_tempStr); END IF; v_tempStr := SUBSTR(v_src, 1, INSTR(v_src, UTL_TCP.CRLF)-1); v_src := TRIM(LEADING UTL_TCP.CRLF FROM SUBSTR(v_src, INSTR(v_src, UTL_TCP.CRLF))); END LOOP; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'println(CLOB) internal procedure:' || sqlerrm() ); RAISE; END println;
--**************************************************************************** --* Main Procedure --**************************************************************************** BEGIN DBMS_OUTPUT.ENABLE(200000); println('begin...');
v_url := i_url; IF v_url IS NULL THEN RAISE_APPLICATION_ERROR(-20000, 'URLを指定してください。'); END IF;
v_myParser := DBMS_XMLPARSER.NEWPARSER(); DBMS_XMLPARSER.PARSE(v_myParser, v_url); v_rssDoc := DBMS_XMLPARSER.GETDOCUMENT(v_myParser); DBMS_LOB.CREATETEMPORARY(v_tempClob, FALSE); DBMS_XMLDOM.WRITETOCLOB(v_rssDoc, v_tempClob); println('DBMS_XMLPARSERバージョン:'||DBMS_XMLPARSER.GETRELEASEVERSION()); println('DBMS_XMLDOMバージョン :'||DBMS_XMLDOM.GETVERSION(v_rssDoc)); println(' '); println('=== パース済みDOMから取得したRSSソース ==='); println(v_tempClob); println('===================='); println(' '); DBMS_LOB.FREETEMPORARY(v_tempClob);
DBMS_XMLPARSER.FREEPARSER(v_myParser);
println('...End');
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'Main Procedure:' || sqlerrm() ); RAISE;
END RSS_FEED_READER;
|
最近のコメント