【发布时间】:2014-05-23 04:02:48
【问题描述】:
我尝试对不同元素(所有者、表格)的列表进行排序。 只需一个就很容易(而且非常快!),例如:
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”时参数的数量或类型错误
我们的目标是列出所有不同的(所有者、表),当然我不在乎您是否发现任何其他想法。
一个解决方案当然是两个单词的一个连接,但我想找到更优雅的!
编辑 @ThinkJet:
我喜欢你的解决方案。它比我的肮脏解决方案更优雅。 但是,您的解决方案比我的慢 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, 1));
end loop;
end;
/
【问题讨论】:
-
好的。只是为了确定......有问题的测试用例是否正确反映了您的需求?是像示例中这样的许多小查询还是相对较少的大数据集交集?
-
是的,这个测试用例大致反映了我的需求
-
请检查更新的答案...
标签: sql oracle collections plsql