Oracle 19C数据库问题

时间:2020-02-14 11:17:30

标签: plsql cursor pipelined-function oracle19c

我有一个可以在11g版本中正常工作的软件包。

但是当我在19c版本中部署相同的程序包时,其行为是不同的。

PFB描述。

包装说明中有一个游标,并使用cursor%rowtype创建了一个表类型。 具有返回表类型的管道函数。

将函数与table子句一起使用

select * from table(function)

以便返回值可以用作表,并且我可以读取带有列名的结果。

在11g中,该函数返回与游标列名称相同的列标题。 但是在19c中,该函数返回的列标题为“ Attr_1,Attr_2等”。

我需要函数将列标题作为游标列名称返回。

注意:由于代码非常敏感,因此无法共享。

样本: PFB样品。

Create table tb_test (id number, description varchar2 (50));  

create or replace package pkg_test is 
    cursor cur_test is 
        select * 
        from tb_test 
        where 1=2; 
    type typ_cur_test is table of cur_test%rowtype; 
    function fn_test(p_rows in number) return typ_cur_test pipelined; 
end;

create or replace package body pkg_test is 
    function fn_test(p_rows in number) return typ_cur_test pipelined as 
    l_tab typ_cur_test := cur_typ_test(); 
    begin 
        for i in 1..p_rows loop l_tab.extend; 
            l_tab(i).Id := i; 
            l_tab(i). Description := 'test'; 
            pipe roe(l_tab(i)); 
        end loop; 
    return ; 
    end; 
end pkg_test;


Select * from table(pkg_test.fn_test(2));

在11g中,上述选择将列标题指定为“ id,description”,但在19c中,我将其获取为“ ATTR_1,ATTR_2”。

请帮助。

1 个答案:

答案 0 :(得分:1)

您的问题的解决方案可能是:

create or replace package pkg_test is 
    cursor cur_test is 
        select * 
        from tb_test 
        where 1=2; 
    type typ_cur_test is table of {tb_test}%rowtype; 
    function fn_test(p_rows in number) return typ_cur_test pipelined; 
end;
  1. 能够复制所解释的行为。在19c-> Attr_1,在11的Attr_2-> ID,描述

  2. 我发现的
  3. 解决方法是使用base table/view%rowtype而不是cursor%rowtype