a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle使用ANYDATA列對數(shù)據(jù)串行化方法

2024-08-29 13:50:45
字體:
供稿:網(wǎng)友
Oracle版本9提供了一種有趣的新的數(shù)據(jù)類型,開發(fā)人員借助此類型可以聲明包括任何類型數(shù)據(jù)的變量。對于單個數(shù)據(jù)來說,此數(shù)據(jù)類型即ANYDATA。對于TABLE或者VARRAY數(shù)據(jù)來說,則為ANYDATASET。ANYTYPE用于描述存儲在ANYDATA或者ANYDATASET變量以及欄中的數(shù)據(jù)類型。這些數(shù)據(jù)類型對于處理存儲在數(shù)據(jù)庫中的xml數(shù)據(jù)或高級序列(Advanced Queues)具有非常重要的意義。說明文檔中提到了ANYDATA數(shù)據(jù)類型可以用于對對象進行串行化(serialize),但與之相關(guān)的示例較少。 串行化首先將數(shù)據(jù)值和其他結(jié)構(gòu)(strUCture)組成為另外一些結(jié)構(gòu),然后將生成的結(jié)構(gòu)的所有構(gòu)成成分輸出為流。流可以被結(jié)構(gòu)返回讀取,并且將覆蓋前一個會話的信息。通常而言,在應(yīng)用程序中進行的保存和打開文件的操作即不過是串行化的一種形式。 一個Oracle數(shù)據(jù)庫或許需要使用串行化功能來存儲一些表格數(shù)據(jù)的某個版本備份,這樣可以在不使用數(shù)據(jù)庫提交(commits)、回滾(rollbacks)、回閃(Flashback)查詢的情況下對數(shù)據(jù)進行查看和其他操作。許多應(yīng)用程序都會用到類似的對數(shù)據(jù)源的控制功能,諸如可以在應(yīng)用級對當前和以前的數(shù)據(jù)版本進行比較,或?qū)喜⒉僮鳎╩erge)和撤銷操作(undo)所產(chǎn)生數(shù)據(jù)改變進行比較。很多此類應(yīng)用程序都被設(shè)計為對每個表格創(chuàng)建一個備份表格。而對于數(shù)據(jù)庫性能和開發(fā)進度來說,要維護這些眾多的備份表格以及之間的各種關(guān)系,成為了生產(chǎn)數(shù)據(jù)(PRoduction data)以外的沉重負擔。 而通過ANYDATA數(shù)據(jù)類型以及動態(tài)SQL功能,使得通過單一的串行化存儲進程來把許多需要備份的表格串行輸入到一個單獨的備份表格成為可能。ANYDATA的一個優(yōu)勢在于,不同于類似VARCHAR2的簡單的轉(zhuǎn)換數(shù)據(jù)類型,使用ANYDATA方法原始的數(shù)據(jù)類型并不會丟失。數(shù)據(jù)可以被存儲在ANYDATA欄或者變量中而不會丟失任何細節(jié)(或根據(jù)在DATA和VARCHAR2之間進行轉(zhuǎn)換的當前NLS語義而定)。這些存儲的數(shù)據(jù)在轉(zhuǎn)化過程中不會有任何損失。 一個ANYDATA對象可以通過使用任何Convert*方法構(gòu)造簡單值的方法來實現(xiàn),或者通過“piecewise”構(gòu)造方法創(chuàng)建諸如對象和數(shù)據(jù)庫一類的更為復(fù)雜的變量。對于本例而言,我將集中解釋如何使用Convert*方法。 為了創(chuàng)建一個串行化進程,我使用了動態(tài)SQL來產(chǎn)生一個對表格中所有數(shù)據(jù)的查詢命令,其中包括ROWID。然后我將查詢命令進行分解并描述,從而得到一個關(guān)于欄和數(shù)據(jù)類型的列表。再定義提取(fetch)出欄,將每一欄從各行中提取出來,然后將其插入到串行化表格中。在本例中我使用了DBMS_SQL,因為“自身動態(tài)SQL(native dynamic SQL)”現(xiàn)在還不能支持描述動態(tài)查詢。絕大多數(shù)的工作都是對從DBMS_SQL數(shù)據(jù)類型代碼到合適的數(shù)據(jù)類型方法以及函數(shù)的轉(zhuǎn)換過程進行處理。要得到這些代碼的列表,可以查看OCI包含文件ocidfn.h,或者是諸如USER_TAB_COLUMNS這樣的對查看(view)的定義。在本例中,我使用了簡單的數(shù)據(jù)類型(可以在EMP和DEPT表格中找到),這樣可以直接對其進行轉(zhuǎn)換。
    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;
   假如我希望對“EMP”和“DEPT”表格串行化,我可以按照以下代碼通過SQL*Plus來完成:
    exec serialize('emp');    exec serialize('dept');    select t.item.gettypename() from serialized_data t;
   使用ANYDATA中的一個問題是,假如是對象,則只有很少的信息可以通過直接SQL恢復(fù)過來。表格數(shù)據(jù)必須使用PL/SQL過程進行訪問。


上一篇:關(guān)于Oracle服務(wù)器性能全面調(diào)整攻略

下一篇:Oracle 9i輕松取得建表和索引DDL語句

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 日本三级在线观看网站 | 日韩城人网站 | 91视频免费网站 | 久久久国产视频 | 国产女人免费看a级丨片 | 日日av拍夜夜添久久免费 | 国产不卡在线观看 | 天堂√在线观看一区二区 | 成视频年人免费看黄网站 | 欧美日韩视频在线第一区 | 久久精品成人免费视频 | 国产精品综合 | 91精彩刺激对白露脸偷拍 | 欧美精品二区三区四区免费看视频 | 91精品国产综合久久久久久蜜月 | 亚洲午夜精品一区二区三区 | 亚洲成人一区 | 中文字幕乱码一区二区三区 | 色视频网站在线观看一=区 www..99re | 三级特黄特色视频 | 亚欧在线观看 | 日日网| 古典武侠第一页久久777 | 国产精品看片 | 色综合国产| 一二区视频 | 毛片日韩 | 99久久久无码国产精品 | 午夜国产在线 | 日韩一区二区三免费高清在线观看 | 欧美国产日韩一区 | 黑料社区av在线 | 免费的日本网站 | 娇妻被3p高潮爽视频 | 91视频观看 | 欧美日韩一区二区视频在线观看 | 亚洲午夜视频在线观看 | www.99久| 久久久精品日韩 | 欧美日韩视频 | 一区综合 |