返回表查询的 PL/SQL 封装函数

Posted

技术标签:

【中文标题】返回表查询的 PL/SQL 封装函数【英文标题】:PL/SQL Package Function that returns table querying 【发布时间】:2015-03-18 18:15:48 【问题描述】:

我正在尝试:制作具有接受数字并从另一个表返回表的函数的包。然后查询这个。我编译了所有类型都没有错误,但是在查询时出现无效数据类型错误。 对于代码中的非英语单词,我深表歉意。

我有 T_Pasutijums 类型的对象表“Pasutijumi”:

Create or Replace Type T_Pasutijums As Object(
Pasutijums_ID integer,
Klients_ID integer,
Soferis_ID integer,
Prece varchar2(20),
Cena number,
Daudzums integer,
Statuss varchar2(12));

然后是封装规范:

Create or Replace package Pakete_1 As
 Type Pasutijums_filtrets Is Record(
 Pasutijums_ID integer,
 Klients_ID integer,
 Soferis_ID integer,
 Prece varchar2(20),
 Cena number,
 Daudzums integer,
 Statuss varchar2(12),
 Gala_Cena number);

 Type Pasutijumi_filtreti Is Table Of Pasutijums_filtrets;
 Function Filtret_Pasutijumus(Gala_Cena number) return Pasutijumi_filtreti;

 End Pakete_1;

和包体:

create or replace
Package Body Pakete_1 As
 Function Filtret_Pasutijumus(Gala_Cena number) return Pasutijumi_filtreti Is
  Cursor Kursors1 Is
  Select A.Pasutijums_ID, A.Klients_ID, A.Soferis_ID, A.Prece, A.Cena,
      A.Daudzums, A.Statuss, A.Cena*A.Daudzums
    From Pasutijumi A
    Where A.Statuss!='NORAIDITS' And A.Cena*A.Daudzums>=Gala_Cena;

  Pasutijumi_table Pasutijumi_filtreti;
  Begin
  Open Kursors1;
    Loop
      Fetch Kursors1 Bulk Collect Into Pasutijumi_table;
      Exit When Kursors1%NOTFOUND;
    End Loop;
    Close Kursors1;
    return Pasutijumi_table;
  End;
End;

但是当我尝试查询时:

Select *
From table(pakete_1.filtret_pasutijumus(20));

我收到 SQL 错误:ORA-00902:无效数据类型。这里有什么问题?

【问题讨论】:

【参考方案1】:

为了让 SQL 能够访问记录和表类型,它们必须是数据库对象,而不是包声明。

create or replace Type Pasutijums_filtrets Is Object(
 Pasutijums_ID integer,
 Klients_ID integer,
 Soferis_ID integer,
 Prece varchar2(20),
 Cena number,
 Daudzums integer,
 Statuss varchar2(12),
 Gala_Cena number);

create or replace Type Pasutijumi_filtreti Is Table Of Pasutijums_filtrets;

Create or Replace package Pakete_1 As
 Function Filtret_Pasutijumus(Gala_Cena number) return Pasutijumi_filtreti;
End Pakete_1;

【讨论】:

哦,好的。谢谢!除此之外,我还必须像这样更改我的包选择部分: Select Pasutijums_filtrets(A.Pasutijums_ID, A.Klients_ID, A.Soferis_ID, A.Prece, A.Cena, A.Daudzums, A.Statuss, A.Cena*A .Daudzum)

以上是关于返回表查询的 PL/SQL 封装函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/SQL 函数体返回 SQL 查询

使用 JDBC 从 PL/SQL 存储函数中获取表返回值

从 PL/SQL 中的查询加硬编码变量返回用户定义的表

从 PL/SQL 函数返回表 - 不正确的数据类型

PL/SQL - 如何从连接表中返回单行

从 PL/SQL 函数返回一个“表”(没有预定义列名)