Oracle 具有基于行类型的集合的ANYDATA
我刚刚发现了Oracle的Oracle 具有基于行类型的集合的ANYDATA,oracle,generics,plsql,Oracle,Generics,Plsql,我刚刚发现了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;
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(到目前为止)的示例都使用对象类型,没有一个使用行类型,但我还没有看到任何(到目前为止)明确表示不能使用行类型的示例
我的目标是清理一些重复性很强的批量收集/插入代码,这些代码一遍又一遍地执行相同的操作,但不同的表使用不同的游标
(Oracle 10g)任何数据都可以使用SQL数据类型,即可以用来定义表列的任何数据 %行类型是PL/SQL构造,因此SQL引擎无法识别。如果您考虑%ROWTYPE的动态特性,您将能够找出原因
想要清除重复代码是一个高尚的想法。我以前在SQL类型中实现过一个ETL处理器,它使用一个超类型对象来拥有泛型处理,并使用子类型来执行特定于表的代码(例如插入)。这些子类型是完全可生成的:不像动态%ROWTYPE实现那样灵活,但仍然很容易 所以我在这个例子中试图做的是不可能的?亲爱的APC,我希望在这里请您看看我关于Pl/SQL中泛型的新问题不是一个坏主意:。从你对这个问题的回答来看,我想你会很有帮助的。