Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL表函数之间的管道_Oracle_Plsql_Plsql Package_Pipelined Function - Fatal编程技术网

Oracle PL/SQL表函数之间的管道

Oracle PL/SQL表函数之间的管道,oracle,plsql,plsql-package,pipelined-function,Oracle,Plsql,Plsql Package,Pipelined Function,我有一个带有2个流水线函数的包。当我试图用另一个函数作为参数调用一个函数时,我得到了“ORA-06553:PLS-306:调用中参数的数目或类型错误”错误 这是包裹: create or replace NONEDITIONABLE TYPE RESULTING_RECORD_RT as object ( CALENDAR NVARCHAR2(1024), PRODUCT NVARCHAR2(1024), MEASURE

我有一个带有2个流水线函数的包。当我试图用另一个函数作为参数调用一个函数时,我得到了“ORA-06553:PLS-306:调用中参数的数目或类型错误”错误

这是包裹:

create or replace NONEDITIONABLE TYPE RESULTING_RECORD_RT as object
   (
          CALENDAR  NVARCHAR2(1024), 
          PRODUCT   NVARCHAR2(1024), 
          MEASURE   NVARCHAR2(1024), 
          VALUE     NUMBER
   );
/
create or replace NONEDITIONABLE TYPE RESULTING_COLS_RT IS TABLE OF RESULTING_RECORD_RT;
/
create or replace package pipe_pkg as
function pipe_func_emp return RESULTING_COLS_RT PIPELINED;
function pipe_func_emp2(input_Set IN resulting_cols_rt) return RESULTING_COLS_RT PIPELINED;
end;
/
create or replace package body pipe_pkg as
function pipe_func_emp return RESULTING_COLS_RT
PIPELINED
is
    test_tbl resulting_cols_rt:= resulting_cols_rt();
begin
    test_tbl.extend;
    test_tbl(1):=resulting_record_rt('A','B','C',1);
    test_tbl.extend;
    test_tbl(2):=resulting_record_rt('A','B','D',2);
    PIPE ROW(test_tbl(1));
    PIPE ROW(test_tbl(2));
    return;
end;
function pipe_func_emp2(input_Set IN resulting_cols_rt) return RESULTING_COLS_RT
PIPELINED
is
    v_tmp NVARCHAR2(10240);
    l_res SYS_REFCURSOR;
    recs resulting_record_rt;
begin
    open l_res for select * from table(input_Set);
    loop
        fetch l_res into recs;
        PIPE ROW(recs);
        exit when l_res%notfound;
    end loop;
    close l_res;
    return;
end;
end;
/
我按如下方式调用函数:

select * from TABLE(pipe_pkg.pipe_func_emp2(CURSOR(select * from TABLE(pipe_pkg.pipe_func_emp()))));
调用将抛出错误:

ORA-06553: PLS-306: wrong number or types of arguments in call to 'PIPE_FUNC_EMP2'
06553. 00000 -  "PLS-%s: %s"

我做错了什么?

函数
pipe\u func\u emp2
预期
结果\u COLS\u RT
作为参数,但得到了
REF CURSOR
。这些是不兼容的类型

尝试以下流水线函数的链接:

create or replace type somerow  as object (id int, val varchar2 (8))
/
create or replace type sometab is table of somerow
/
create or replace package pack as
    function func1 return sometab pipelined;
    function func2 (cur sys_refcursor) return sometab pipelined;
end;
/
create or replace package body pack as
    function func1 return sometab pipelined is
        tab sometab := sometab (somerow (1,'AAA'), somerow (2,'BBB'));
    begin
        for i in 1..tab.count loop 
            pipe row (tab(i)); 
        end loop;
        return;
    end;
    function func2 (cur sys_refcursor) return sometab pipelined is
        sr somerow;
    begin
        loop
            fetch cur into sr;
            exit when cur%notfound;
            pipe row (sr);
        end loop;
        close cur;
        return;
    end;
end;
/
查询及其结果:

select * 
from table (pack.func2 (
    cursor (select value (p) from table (pack.func1()) p )))
/

        ID VAL     
---------- --------
         1 AAA     
         2 BBB     

美好的我试着用这个问题的例子来说明这一点,但我没能做到。你为什么不以此为基础树立榜样?谢谢。我用两行相同的值2得到了相同的结果。没关系<代码>未找到cur%时退出只需上移一行即可……)说到在打字错误上花费时间:d在OP的例子中,同样的错误,我没有跟踪;)@布伦格尔:是的,这是可能的。我更改了它,因为选择完整表内容对于流水线函数几乎没有意义。