我正在尝试将带有存储在其中的对象的 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;
这段代码也失败了。我见过人们以与我相同的方式使用这种方法,而且它似乎对他们有用。为什么这对我不起作用?我究竟做错了什么?