我有一个可以在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”。
请帮助。
答案 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;
能够复制所解释的行为。在19c-> Attr_1,在11的Attr_2-> ID,描述
解决方法是使用base table/view%rowtype
而不是cursor%rowtype
。