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; |