drop table serialized_data; create table serialized_data ( tablename varchar2(30) not null, row_id rowid not null, colseq integer not null, item anydata ); create or replace procedure serialize(p_tablename varchar2) is l_tablename varchar2(30) := upper(p_tablename); c pls_integer; -- cursor x pls_integer; -- dummy col_cnt pls_integer; dtab dbms_sql.desc_tab; l_rowid char(18); l_anydata anydata; l_vc2 varchar2(32767); l_number number; l_vc varchar(32767); l_date date; l_raw raw(32767); l_ch char; l_clob clob; l_blob blob; l_bfile bfile; begin c := dbms_sql.open_cursor; dbms_sql.parse(c,'select rowid,'p_tablename'.* from 'p_tablename, dbms_sql.native); dbms_sql.describe_columns(c,col_cnt,dtab); dbms_sql.define_column(c,1,l_rowid,18); for i in 2 .. col_cnt loop case dtab(i).col_type when 1 then dbms_sql.define_column(c,i,l_vc2,dtab(i).col_max_len); when 2 then dbms_sql.define_column(c,i,l_number); when 9 then dbms_sql.define_column(c,i,l_vc,dtab(i).col_max_len); when 12 then dbms_sql.define_column(c,i,l_date); when 23 then dbms_sql.define_column_raw(c,i,l_raw,dtab(i).col_max_len); when 96 then dbms_sql.define_column_char(c,i,l_ch,dtab(i).col_max_len); when 112 then dbms_sql.define_column(c,i,l_clob); when 113 then dbms_sql.define_column(c,i,l_blob); when 114 then dbms_sql.define_column(c,i,l_bfile); end case; end loop; x := dbms_sql.execute(c); while dbms_sql.fetch_rows(c) != 0 loop dbms_sql.column_value(c,1,l_rowid); for i in 2 .. col_cnt loop case dtab(i).col_type when 1 then dbms_sql.column_value(c,i,l_vc2); l_anydata := ANYDATA.ConvertVarchar2(l_vc2); when 2 then dbms_sql.column_value(c,i,l_number); l_anydata := ANYDATA.ConvertNumber(l_number); when 9 then dbms_sql.column_value(c,i,l_vc); l_anydata := ANYDATA.ConvertVarchar(l_vc); when 12 then dbms_sql.column_value(c,i,l_date); l_anydata := ANYDATA.ConvertDate(l_date); when 23 then dbms_sql.column_value(c,i,l_raw); l_anydata := ANYDATA.ConvertRaw(l_raw); when 96 then dbms_sql.column_value(c,i,l_ch); l_anydata := ANYDATA.ConvertChar(l_ch); when 112 then dbms_sql.column_value(c,i,l_clob); l_anydata := ANYDATA.ConvertClob(l_clob); when 113 then dbms_sql.column_value(c,i,l_blob); l_anydata := ANYDATA.ConvertBlob(l_blob); when 114 then dbms_sql.column_value(c,i,l_bfile); l_anydata := ANYDATA.ConvertBFile(l_bfile); end case; insert into serialized_data (tablename,row_id,colseq,item) values (l_tablename,l_rowid,i,l_anydata); end loop; end loop; dbms_sql.close_cursor(c); end; / show errors; |