我试图用SQL查询两种类型。
类型创建如下:
create or replace type MYCOLLSTRING is table of varchar2(4000)
现在我有两个这种类型的PL / SQL集合:
declare
col1 MYCOLLSTRING;
col2 MYCOLLSTRING;
begin
col1 := MYCOLLSTRING();
col2 := MYCOLLSTRING();
col1.extend();
col1(col1.last) := 'Test1';
col1.extend();
col1(col1.last) := 'Test2';
col2.extend();
col2(col2.last) := 'Test3';
col2.extend();
col2(col2.last) := 'Test4';
--collections prepared
select *
from table(col1) x,
table(col2) y;
--here i'm trying to join x and y using their collection key
end;
正如您在查询中看到的那样,我尝试通过记录集键加入两个结果。截至目前,唱片集没有字段名称,因此我现在也不知道如何加入他们的价值观。
我很感激你的意见!
答案 0 :(得分:3)
默认字段为COLUMN_VALUE。应该是这样的:
select *
from table(col1) x,
table(col2) y
where x.COLUMN_VALUE = y.COLUMN_VALUE;
答案 1 :(得分:1)
集合中有一个索引,但您只能在PL / SQL上下文中引用它。
for i in 1..col1.count loop
dbms_output.put_line(i || ': ' || col1(i) || ', ' || col2(i));
end loop;
在SQL查询中,您可以根据每个集合中的行号生成伪密钥。你需要选择一些东西,如果你想要两个列,你需要一个不同的集合类型;对于这个例子,我已经声明了一个记录类型和一个这种类型的表:
declare
type rec_type is record (c1 varchar2(4000), c2 varchar2(4000));
type rec_table_type is table of rec_type;
col1 MYCOLLSTRING;
col2 MYCOLLSTRING;
col3 rec_table_type;
begin
...
select x.column_value, y.column_value
bulk collect into col3
from (select rownum as column_key, column_value from table(col1)) x
join (select rownum as column_key, column_value from table(col2)) y
on y.column_key = x.column_key;
--here i'm trying to join x and y using their collection key
for i in 1..col3.count loop
dbms_output.put_line(i || ': ' || col3(i).c1 || ', ' || col3(i).c2);
end loop;
end;
/
PL/SQL procedure successfully completed.
1: Test1, Test3
2: Test2, Test4
当然,假设基本集合具有相同数量的元素;你可以使用外连接来修复它,如果没有。根据你正在做的事情,你可能实际上并不需要第三个集合,并且可以使用游标来进行连接并使用它的结果:
for r in (
select x.column_value c1, y.column_value c2
from (select rownum as column_key, column_value from table(col1)) x
join (select rownum as column_key, column_value from table(col2)) y
on y.column_key = x.column_key
) loop
dbms_output.put_line(r.c1 || ', ' || r.c2);
end loop;
end;
/
PL/SQL procedure successfully completed.
Test1, Test3
Test2, Test4
如果你确实需要第三个集合,你可以将它们组合起来填充它,而不需要SQL上下文切换:
col3 := rec_table_type();
for i in 1..col1.count loop
col3.extend;
col3(i).c1 := col1(i);
col3(i).c2 := col2(i);
end loop;
for i in 1..col3.count loop
dbms_output.put_line(i || ': ' || col3(i).c1 || ', ' || col3(i).c2);
end loop;
end;
/
PL/SQL procedure successfully completed.
1: Test1, Test3
2: Test2, Test4
这仍假设集合大小相同。如果不是,你可以得到下标错误;您可以在每个元素引用之前测试大小,或者通过用较小的元素填充较小的元素来强制它们具有相同的大小。