1

我有一个在 11g 版本中运行良好的包。

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

PFB 说明。

包规范有一个游标,并使用 cursor%rowtype 创建了一个表类型。具有返回表类型的流水线函数。

使用带有表子句的函数

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,描述”,但在 19c 中,我得到的是“ATTR_1,ATTR_2”。

请帮忙。

4

1 回答 1

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. 我发现的解决方法是使用base table/view%rowtype而不是cursor%rowtype.

于 2020-02-14T13:22:12.887 回答