大佬教程收集整理的这篇文章主要介绍了处理集合,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
至少在第二种情况下,您丢失了表定义。这个说法:
create or replace TYPE tbl_List2 IS OBjeCT (l_owner VARCHAR2(64),l_name VARCHAR2(64));
仅声明对象(或记录)类型,而不声明表。
因此,您需要分两个步骤进行操作:
create or replace TYPE tbl_List_rec IS OBjeCT (l_owner VARCHAR2(64),l_name VARCHAR2(64));
/
create or replace TYPE tbl_List2 as table of tbl_List_rec;
/
之后,您需要在脚本中进行一些语法更正:
declare
l_object tbl_List2;
i number;
begin
-- for List initialization it must be filled with constructed objects
l_object := tbl_List2( tbl_List_rec('','') );
for i in 1..100000 loop
-- 1. SELEct values to variable
-- 2. Fix constructor for List
SELEct
l_object MulTISET UNION disTinCT tbl_List2(tbl_List_rec('myowner','myTable'))
into
l_object
from
dual;
end loop;
for i in l_object.first .. l_object.last loop
-- output separate fIElds, there are Now default conversion from
-- user-defined objects to varchar2.
DBMS_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_Name);
end loop;
end;
/
由于上下文切换数量众多,上述解决方案相对较慢。但是,如果没有一些额外的工作,就不能直接在PL / sql中完成复杂对象类型实例的比较。 为了使Oracle知道对象实例是相同还是不同,我们需要为对象类型定义映射或排序方法。两种方法都不允许,因此需要选择适当的一种。MAP方法的执行速度更快,在我们的案例中无需排序,因此请执行以下操作:
create or replace TYPE tbl_List_rec2 AS OBjeCT (
l_owner VARCHAR2(64),
l_name VARCHAR2(64),
map member function get_key return varchar2
);
/
执行:
create or replace @R_14_3772@ tbl_List_rec2 AS
map member function get_key return varchar2
is
begin
return l_owner||chr(1)||l_name;
end;
end;
/
之后,可以像varchar2
问题中第一个示例中一样简单地在PL / sql代码中测试对象的相等性:
declare
l_object tbl_List2a;
i number;
begin
l_object := tbl_List2a( tbl_List_rec2('','') );
for i in 1..100000 loop
l_object := l_object MulTISET UNION disTinCT tbl_List2a(tbl_List_rec2('myowner','myTable'));
end loop;
for i in l_object.first.. l_object.last loop
DBMS_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_Name);
end loop;
end;
/
我尝试对不同元素(所有者,表)的列表进行排序。只需一个,就很容易(并且非常快!),例如:
declare
TYPE tbl_list IS TABLE OF VARCHAR2(64);
l_tables tbl_list;
i number;
begin
l_tables:=tbl_list();
for i in 1..100000
loop
l_tables:= l_tables MULTISET UNION DISTinCT tbl_list('myTable');
end loop;
for i in l_tables.first.. l_tables.last
loop
DBMS_output.put_line(l_tables(i));
end loop;
end;
/
我尝试对列表进行同样的操作,但是失败了:
create or replace TYPE tbl_list2 IS OBjeCT (l_owner VARCHAR2(64),l_name VARCHAR2(64));
declare
l_object tbl_list2;
i number;
begin
l_object:=tbl_list2('','');
for i in 1..100000
loop
l_object:= l_object MULTISET UNION DISTinCT tbl_list2('myowner','myTable');
end loop;
for i in l_object.first.. l_object.last
loop
DBMS_output.put_line(l_object(i));
end loop;
end;
/
但是我发现了以下问题: PLS-00306:调用“ MULTISET_UNION_DISTinCT”时参数的数量或类型错误@H_696_62@
目的是要列出所有不同的(所有者,表)列表,我当然不在乎是否有其他想法。
解决方案当然是两个词中的一个词的串联,但是我想找到更优雅的方法!
我喜欢您的解决方案。比我肮脏的解决方案还优雅。但是,您的解决方案比我的解决方案慢70倍!那么,我们如何才能汇聚一个优雅的蚂蚁速度解决方案呢?
这是我肮脏的一个:
declare
TYPE tbl_list IS TABLE OF VARCHAR2(64);
l_tables tbl_list;
i number;
begin
l_tables:=tbl_list();
for i in 1..100000
loop
l_tables:= l_tables MULTISET UNION DISTinCT tbl_list('myowner'||','||'myTable');
end loop;
for i in l_tables.first.. l_tables.last
loop
DBMS_output.put_line('owneR='||REGEXP_SUBSTR(l_tables(i),'[^,]+',1,1));
DBMS_output.put_line('TABLE='||REGEXP_SUBSTR(l_tables(i),1));
end loop;
end;
/
以上是大佬教程为你收集整理的处理集合全部内容,希望文章能够帮你解决处理集合所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。