SQL将ANYDATA对象插入表中 - ORA-22370

时间:2013-10-24 13:16:03

标签: sql oracle object plsql

我正在尝试将存储在其中的对象的ANYDATA类型插入到表列中。 我可以使用Varchars,数字和日期,但不能使用对象。这应该是非常简单的东西。这是代码:

/*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 BLOCK:

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

此代码也失败了。我看到人们使用这种方法的方式与我的方法相同,似乎对他们有效。为什么这对我不起作用?我做错了什么?

1 个答案:

答案 0 :(得分:2)

如此处所述Oracle 11.2 Anydata type

  

目前不支持持久存储其类型包含除BFILE之外的嵌入式LOB的ANYDATA实例。

很遗憾,您无法存储带有LOB字段的对象类型。我在SQLFiddle上检查了你的代码,当我从对象类型中删除了CLOB字段时,它有效。