我有一个过程接受类似于parent_arr的输入,如下所示,作为来自应用层的输入,通过ODP.Net。在该过程的第一步中,我将数组中的数据存储在全局临时表中,因此我可以使用set逻辑而不是pl / sql循环继续执行以下几个步骤。只要数组只有一个parent_typ成员,一切都很好。但是,当有多个成员时,我得到ORA-01427,单行查询返回多行。下面的查询返回两个集合。我需要在一个将显示child.name和child.value的sql语句中取消嵌套这两个集合。怎么办?
示例对象
create type child_typ is object( name varchar2(100), value number );
create type child_arr is table of dropme_child_typ;
create type parent_typ is object( pname varchar2(100), child dropme_child_arr );
create type parent_arr is table of dropme_parent_typ;
以下查询将抛出ORA-01427
select * from table(
select child
from table( parent_arr(
parent_typ( 'TEST1',
child_arr(
child_typ( 'C1', 1 ),
child_typ( 'C2', 2 ) ) ),
parent_typ( 'TEST2',
child_arr(
child_typ( 'C3', 3 ),
child_typ( 'C4', 4 ) ) ) ) ) );
此查询有效,但返回对象child_arr
的列select child
from table( parent_arr(
parent_typ( 'TEST1',
child_arr(
child_typ( 'C1', 1 ),
child_typ( 'C2', 2 ) ) ),
parent_typ( 'TEST2',
child_arr(
child_typ( 'C3', 3 ),
child_typ( 'C4', 4 ) ) ) ) );
此查询失败,因为我无法访问“child”中的值
select child.name, child.value from
table( parent_arr(
parent_typ( 'TEST1',
child_arr(
child_typ( 'C1', 1 ),
child_typ( 'C2', 2 ) ) ),
parent_typ( 'TEST2',
child_arr(
child_typ( 'C3', 3 ),
child_typ( 'C4', 4 ) ) ) ) );
请告诉我有一种方法可以在不使用pl / sql循环的情况下执行此操作(这是迄今为止我能够成功的唯一方法)。速度至关重要。我尝试使用forall语句循环遍历parent_arr的成员,但是它会引发批量的in-bind错误。
答案 0 :(得分:1)
您可以使用lateral join取消您的子对象:
SQL> WITH my_data AS (
2 SELECT pname, child
3 FROM TABLE(parent_arr(parent_typ('TEST1',
4 child_arr(child_typ('C1', 1),
5 child_typ('C2', 2))),
6 parent_typ('TEST2',
7 child_arr(child_typ('C3', 3),
8 child_typ('C4', 4)))))
9 )
10 SELECT my_data.pname, child.name, child.value
11 FROM my_data, table(my_data.child) child;
PNAME NAME VALUE
-------- ----- ----------
TEST1 C1 1
TEST1 C2 2
TEST2 C3 3
TEST2 C4 4
这是一种外部联接形式,您可以将父项与其子项一起加入。