带有基于rowtype的集合的ANYDATA

时间:2011-07-04 19:08:28

标签: oracle generics plsql

我刚刚发现了Oracle的ANYDATAANYTYPE,并认为它对泛型有用 - 如果我有一些非常重复的代码。我尝试了一个非常简单的代码示例,如下所示:

declare
    --simple test query
    cursor myCurs is
        select sysdate from dual;

    type t_arr is table of myCurs%rowtype;
    v_arr t_arr;

    v_anydata ANYDATA;    
begin

    open myCurs;
    fetch myCurs bulk collect into v_arr;
    close myCurs;

    dbms_output.put_line(v_arr.count || ' records');

    v_anydata := ANYDATA.convertCollection(v_arr);
    dbms_output.put_line(anydata.gettypename(v_anydata));

end;
/

运行此代码会出现错误“ORA-22370:方法ORA-22370错误使用方法ConvertCollection的错误消息”(是的,它实际上重复了ORA-22370)。

我的问题是:是否可以在行类型集合上使用ANYDATA?我问这个是因为我所看到的所有ANYDATA(到目前为止)集合的例子都使用了对象类型,没有使用行类型,但我还没有看到任何明确表示不能使用行类型的东西。

我的目标是清理一些非常重复的批量收集/插入代码,这些代码一遍又一遍地执行相同的操作,但是对于不同的表使用不同的游标。

(Oracle 10g)

1 个答案:

答案 0 :(得分:5)

ANYDATA使用SQL data_types,即可用于定义表列的任何内容。

%ROWTYPE是PL / SQL构造,因此SQL引擎无法识别。如果您考虑%ROWTYPE的动态特性,您将能够找出原因。


想要清理重复代码是一个崇高的想法。我以前在SQL类型中实现了一个ETL处理器,它使用超类型Object来拥有通用处理,并使用子类型来执行特定于表的代码(例如插入)。这些子类型是完全可生成的:不像动态%ROWTYPE实现那样光滑,但仍然很容易。