Plsql 管道嵌套对象类型

Plsql 管道嵌套对象类型,plsql,oracle11g,pipeline,Plsql,Oracle11g,Pipeline,我只是想实现管道行嵌套类型。有很多例子,但没有一个是我能够应用的 我的类型是: create type t1_row as object ( a1 number, a2 varchar2(10) ); create type t1_tab as table of t1_row; create type t2_row as object ( b1 number, b2 varchar2(10), b3 t1_tab ); create type t2_tab as table of t2_row

我只是想实现管道行嵌套类型。有很多例子,但没有一个是我能够应用的

我的类型是:

create type t1_row as object ( a1 number, a2 varchar2(10) );
create type t1_tab as table of t1_row; 
create type t2_row as object ( b1 number, b2 varchar2(10), b3 t1_tab );
create type t2_tab as table of t2_row;
我尝试过用很多方法创建函数,但没有一种能够成功编译

一个例子:

create or replace function fn (r in number) return t2_row pipelined is
    l_row1 t1_tab;
    l_row2 t2_tab;
begin
    for i in 1..r loop            
        for j in 1..r loop
            l_row1(j).a1 := j;
            l_row1(j).a2 := 'a2 ' || j;
        end loop;
        l_row2(i) := (i,l_row1);
        PIPE ROW (l_row2);
    end loop;
    return;
end;
此代码产生以下错误:

[错误]PLS-00630(1:12):PLS-00630:流水线函数必须具有受支持的集合返回类型

[错误]PLS-00382(10:22):PLS-00382:表达式类型错误

任何帮助建议或任何类似示例都可能有用


版本:Oracle 11g 11.2.0.1.0版

t2\u行的构造缺少第2个参数,您正在 返回错误的类型。试试这个:

create or replace function fn (r in number) return t2_tab pipelined is
    l_row1 t1_tab := t1_tab();
    l_row2 t2_tab := t2_tab();
begin
    for i in 1..r loop            
        for j in 1..r loop
           l_row1.extend(1);
           l_row1(j) := t1_row(j,'a2 ' || j);
        end loop;
        l_row2.extend(1);
        l_row2(i) := t2_row(i,'TEST',l_row1);
       PIPE ROW (l_row2(i));
    end loop;
    return;
end;

另外,请阅读如何使用pl/sql对象集合。

您的代码有两个语法错误和一个逻辑错误

第一个语法错误是函数的返回类型应该是集合而不是行类型,因此

 return t2_tab pipelined
第二个语法错误是,在实例化对象时需要包含类型,并且参数的数量必须与类型的签名匹配。因此,外部循环分配应为:

    l_row2(i) := t2_row(i, 'T2', l_row1);
逻辑错误是我们不需要为输出维护集合变量。我们只需要一个行变量

此外,索引计数似乎有点混乱,因此我的代码可能与您的意图不同

create or replace function fn (r in number) 
    return t2_tab pipelined 
is
    l_tab1 t1_tab;
    l_row2 t2_row;
begin
    for i in 1..r loop            
        l_tab1 := new t1_tab();
        l_tab1.extend(r);
        for j in 1..r loop
            l_tab1(j) := t1_row(j*i, 'a2 ' || j);
        end loop;
        l_row2 := t2_row(i, 'T2', l_tab1);
        PIPE ROW (l_row2);
    end loop;
    return;
end;
/
以下是跑步记录:

SQL> select * from table(fn(3));

   B1 B2  B3(A1, A2)
----- --- ---------------------------------------------------------------
    1 T2  T1_TAB(T1_ROW(1, 'a2 1'), T1_ROW(2, 'a2 2'), T1_ROW(3, 'a2 3'))
    2 T2  T1_TAB(T1_ROW(2, 'a2 1'), T1_ROW(4, 'a2 2'), T1_ROW(6, 'a2 3'))
    3 T2  T1_TAB(T1_ROW(3, 'a2 1'), T1_ROW(6, 'a2 2'), T1_ROW(9, 'a2 3'))

SQL> 

当你去编译它时,这个例子给了你什么错误?([Error]PLS-00630(1:12):PLS-00630:流水线函数必须有一个受支持的集合返回类型[Error]PLS-00382(10:22):PLS-00382:表达式的类型是错误的),但我写它只是为了一个例子,我无法添加我尝试添加的所有示例:ORA-06531:对未初始化集合的引用非常感谢这段代码也可以工作,现在我知道该怎么做了