我刚刚发现了Oracle的ANYDATA
和ANYTYPE
,并认为它对泛型有用 - 如果我有一些非常重复的代码。我尝试了一个非常简单的代码示例,如下所示:
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)
答案 0 :(得分:5)
ANYDATA使用SQL data_types,即可用于定义表列的任何内容。
%ROWTYPE是PL / SQL构造,因此SQL引擎无法识别。如果您考虑%ROWTYPE的动态特性,您将能够找出原因。
想要清理重复代码是一个崇高的想法。我以前在SQL类型中实现了一个ETL处理器,它使用超类型Object来拥有通用处理,并使用子类型来执行特定于表的代码(例如插入)。这些子类型是完全可生成的:不像动态%ROWTYPE实现那样光滑,但仍然很容易。