1

内部にオブジェクトが格納されている ANYDATA 型をテーブル列に挿入しようとしています。オブジェクトではなく、Varchar、数値、および日付で正常に動作するようにできます。これは非常に単純なものでなければなりません。コードは次のとおりです。

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

このコードも失敗します。私と同じようにこの方法を使っている人を見てきましたが、彼らにとってはうまくいくようです。なぜこれがうまくいかないのですか?私は何を間違っていますか?

4

1 に答える 1

2

ここで述べたように、Oracle 11.2 Anydataタイプ

BFILE 以外の埋め込み LOB を含む型の ANYDATA インスタンスの永続ストレージは、現在サポートされていません。

残念ながら、オブジェクトタイプをLOBフィールドに保存することはできません。SQLFiddle でコードを確認しましたCLOBが、オブジェクト タイプからフィールドを削除すると機能しました。

于 2013-10-24T13:36:02.453 に答える