2013-10-24 18 views
1

我試圖插入存儲裏面到表列的對象的ANYDATA類型。 我可以得到它做工精細用VARCHAR處理,數字和日期,但不是對象。這應該是非常簡單的東西。代碼如下:SQL插入ANYDATA對象插入到表 - ORA-22370

/*CREATE TYPE SPEC*/ 
CREATE OR REPLACE TYPE my_ot AS OBJECT 
(
    some_var  VARCHAR2(50), 
    some_clob  CLOB, 
    MEMBER FUNCTION get_some_var RETURN VARCHAR2, 
    MEMBER FUNCTION get_some_clob RETURN CLOB 
); 

/*CREATE TYPE BODY*/ 
CREATE OR REPLACE TYPE BODY my_ot AS 
    MEMBER FUNCTION get_some_var RETURN VARCHAR2 IS 
    BEGIN 
     RETURN to_char(SELF.some_var); 
    END; 
    MEMBER FUNCTION get_some_clob RETURN CLOB IS 
    BEGIN 
     RETURN to_char(SELF.some_clob); 
    END; 
END; 

/*CREATE TABLE*/ 
create table my_anydata_table (id NUMBER, mydata sys.anyData); 

/*INSERT ANYDATA NUMBER, DATE AND VARCHAR2 WITH NO PROBLEMS*/ 
insert into my_anydata_table values (1, sys.anyData.convertNumber(100)); 
insert into my_anydata_table values (2, sys.anyData.convertDate(sysdate)); 
insert into my_anydata_table values (3, sys.anyData.convertVarchar2('SOME TEXT')); 

上述所有代碼均正常工作,沒有錯誤。

/*INSERT ANYTYPE OBJECT - RETURNS ERROR: ORA-22370*/ 
insert into my_anydata_table values (4, sys.anyData.convertObject(my_ot('input_var', 'input_clob'))); 

這種失敗,所以我想它使用PL/SQL塊:

/*TRY AGAIN using PL/SQL BLOCK*/ 
DECLARE 
    my_fav_obj my_ot; 
    my_anydata sys.anydata; 
BEGIN 

    my_fav_obj := my_ot('input_var', 'input_clob'); 
    my_anydata := ANYDATA.ConvertObject(my_fav_obj); 
    insert into my_anydata_table values (4, my_anydata); 

END; 

此代碼也將失敗。我看到人們使用這種方法的方式與我一樣,似乎也適用於他們。爲什麼這不適合我?我究竟做錯了什麼?

+0

也許這可能的選項:http://www.dba-oracle.com/t_convert_to_blob_datatype.htm – ceving

回答

2

如這裏指出甲骨文11.2 Anydata type

ANYDATA情況下,目前不支持其類型包含嵌入的LOB以外BFILES的持久性存儲。

因此,不幸的是,您不能存儲LOB字段的對象類型。我檢查你的代碼上SQLFiddle,它工作時,我從對象類型刪除CLOB領域。