Sei sulla pagina 1di 4

--1 -CREATE TABLE TO STORE THE NOTEPAD DATA USING CLOB DATA TYPE (CONVT_CLOB_NOT

E)
--2 -CREATE TABLE TO STORE THE NOTEPAD DATA USING LONG DATA TYPE (CONVT_LONG_NOT
E)
--3 -POPULATE THE CONVT_CLOB_NOTE TABLE WITH SAMPLE DATA FOR THE EXERCISE (100,0
00 ROWS; 320,000 CHARS PER ROW)
--4 -MANIPULATE THE DATA IN THE CLOB COLUMN IN THE CONVT_CLOB_NOTE TABLE
--5 -EXTRACT THE DATA A CHUNK AT A TIME FROM THE CLOB COLUMN IN THE CONVT_CLOB_N
OTE TABLE. WRITE EACH CHUNK AS A SEPARATE RECORD TO THE CONVT_LONG_NOTE TABLE.
------------------------------------------------------------------------------
select sysdate from dual;
------------------------------------------------------------------------------

--CREATE A TABLE WITH A CLOB COLUMN TO STORE THE NOTEPAD DATA


DROP TABLE CONVT_CLOB_NOTE;
CREATE TABLE CONVT_CLOB_NOTE
(
ROW_ID NUMBER PRIMARY KEY,
NOTE_DATA CLOB
);

--CREATE A TABLE WITH A LONG COLUMN TO STORE THE NOTEPAD DATA. THIS REPRESENTS
THE NOTEPAD TABLE.
DROP TABLE CONVT_LONG_NOTE;
CREATE TABLE CONVT_LONG_NOTE
(
ROW_ID NUMBER primary key,
NOTE_ID NUMBER,
MESSAGE_ID NUMBER,
MESSAGE_SIZE NUMBER,
CHUNK_SIZE NUMBER,
NOTE_DATA LONG
);

------------------------------------------------------------------------------
select sysdate from dual;
------------------------------------------------------------------------------

--PL/SQL BLOCK TO WRITE SAMPLE CLOB DATA IN CHUNKS TO THE TABLE - CONVT_CLOB_NOT
E
DECLARE
vv_chunk_note_data varchar2(32000);
vn_chunk_note_size number := 32000;
vn_chunk_note_start number := 1;
vc_whole_note_data clob;
vn_whole_note_size number;
vn_note_id number;
vn_loop_target number;
BEGIN
--add 100,000 rows of data containing clob data
FOR X IN 1..10
LOOP
INSERT INTO CONVT_CLOB_NOTE VALUES (X, EMPTY_CLOB())
RETURNING note_data INTO vc_whole_note_data;

dbms_lob.open(vc_whole_note_data, dbms_lob.lob_readwrite);
vn_chunk_note_start := 1;
vn_chunk_note_size := 32000;
FOR Y IN 1..10
LOOP
vv_chunk_note_data := rpad(('<note_data>' || rpad( 'A', 30000, 'A')
|| '</note_data> ENDING'), vn_chunk_note_size,' ');
dbms_lob.write (vc_whole_note_data, vn_chunk_note_size, vn_chunk_not
e_start, vv_chunk_note_data);
vn_chunk_note_start := vn_chunk_note_start + vn_chunk_note_size;
END LOOP;
dbms_lob.close(vc_whole_note_data);

END LOOP;
COMMIT;
END;
/

------------------------------------------------------------------------------
select sysdate from dual;
------------------------------------------------------------------------------

-----PARSE OPTION 1 - Parsing the whole table at a time -----------------


/*
UPDATE XXX
SET ABC = regexp_replace(regexp_replace(regexp_replace(YYYY, '\&' || 'nbsp;', ''
), '\&' || 'amp;', '&'), '<(.|\n)*?>', null)
;
COMMIT;
*/
------------------------------------------------------------------------------
select sysdate from dual;
------------------------------------------------------------------------------
--PL/SQL BLOCK TO READ CLOB DATA IN CHUNCKS FROM THE TABLE - CONVT_CLOB_NOTE

DECLARE
vv_chunk_note_data varchar2(32000);
vn_chunk_note_size number := 32000;
vn_chunk_note_start number := 1;
vc_src_note_data clob;
vc_mod_note_data clob;
vc_mod_note_size number;
vn_note_id number;
vn_loop_target number;
vn_notepad_id number := 0;
vn_loop_count number := 0;
vn_message_id number;
vv_chunk_note_data1 varchar2(32000);
vv_chunk_note_data2 varchar2(32000);
BEGIN
--add 100,000 rows of data containing clob data
FOR each_row IN (select * from convt_clob_note where row_id < 100)
LOOP
------------------------------------------------------------------------
--this update statement is required due to a bug - this is just a dummy
update to avoid "required transaction message"
update convt_clob_note
set row_id = each_row.row_id
where row_id = -999;
------------------------------------------------------------------------
vc_src_note_data := each_row.note_data; --the original html file
-----PARSE OPTION 2 - Parsing the whole html at a time -----------------
vc_mod_note_data := regexp_replace(regexp_replace(regexp_replace(vc_src_
note_data, '\&' || 'nbsp;', ''), '\&' || 'amp;', '&'), '<(.|\n)*?>', null);
vc_mod_note_size := dbms_lob.getlength(vc_mod_note_data);
vv_chunk_note_data1 := dbms_lob.substr(vc_mod_note_data, 32000, 1);
--get the first chunk after modification
vv_chunk_note_data2 := dbms_lob.substr(vc_mod_note_data, 32000, 288001);
--get the second chunk after modification
-----PARSE OPTION 3 - Parsing part of the html at a time --------------
--vv_chunk_note_data1 := dbms_lob.substr(vc_mod_note_data, 32000, 1)
; --get the first chunk before modification
--vv_chunk_note_data2 := dbms_lob.substr(vc_mod_note_data, 32000, 32001)
; --get the second chunk before modification
--vv_chunk_note_data1 := regexp_replace(regexp_replace(regexp_replace(vv
_chunk_note_data1, '\&' || 'nbsp;', ''), '\&' || 'amp;', '&'), '<(.|\n)*?>', nul
l);
--vv_chunk_note_data2 := regexp_replace(regexp_replace(regexp_replace(vv
_chunk_note_data2, '\&' || 'nbsp;', ''), '\&' || 'amp;', '&'), '<(.|\n)*?>', nul
l);
--------INSERT INTO THE NOTEPAD - EACH CHUNK WOULD BE A NOTEPAD RECORD
-------
--this example uses the parsing method option 2
if length(trim(vv_chunk_note_data1)) > 0 then
vn_loop_count := vn_loop_count + 1;
INSERT INTO convt_long_note VALUES (vn_loop_count, vn_loop_count, vn
_loop_count, vc_mod_note_size, 32000, vv_chunk_note_data1);
end if;
if length(trim(vv_chunk_note_data2)) > 0 then
vn_loop_count := vn_loop_count + 1;
INSERT INTO convt_long_note VALUES (vn_loop_count, vn_loop_count, vn
_loop_count, vc_mod_note_size, 32000, vv_chunk_note_data2);
end if;
END LOOP;

COMMIT;
END;
/
------------------------------------------------------------------------------
select sysdate from dual;
------------------------------------------------------------------------------

Potrebbero piacerti anche