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

Posted

技术标签:

【中文标题】从 PL/SQL 函数返回表 - 不正确的数据类型【英文标题】:Returning a table from PL/SQL function - incorrect datatype 【发布时间】:2016-12-29 15:11:40 【问题描述】:

我的函数有问题,应该返回一个表。但是,当我想运行这个函数时,会返回错误“不正确的数据类型”。无论如何,包正在编译正确。

我不知道问题出在哪里。

这是我的代码:

    create or replace package PKG_BORROW as
    type advertisement_header is record(
    id_advertisment number,
    title   varchar2(100),
    date_added timestamp,
    username varchar2(100),
    regionName varchar2(100),
    id_category number
    );
    type adv_head_tab is table of advertisement_header;



    enter code here

   function get_adv_header_filter
  (title varchar2,username varchar2,regionName varchar2,categoryName varchar2)
  return adv_head_tab;

  end ;

  /
  create or replace package body PKG_BORROW 
  as

  function get_adv_header_filter
  (title varchar2,username varchar2,regionName varchar2,categoryName varchar2)
  return adv_head_tab as
  l_tab adv_head_tab := adv_head_tab();
  query varchar2(500);
   TYPE CurTyp  IS REF CURSOR;
  v_adv_cursor    CurTyp;

  begin
    query:='select a.id_advertisement,a.title,a.date_added,a.id_user,r.name,i.id_item_category from advertisement a,region r,item_category i
    where a.id_region=r.id_region and a.id_item_category=i.id_item_category ';

    open v_adv_cursor for query;
    loop
        fetch v_adv_cursor into l_tab(l_tab.last);
        exit when v_adv_cursor%NOTFOUND;
    end loop;
   close v_adv_cursor;
   dbms_output.put_line(l_tab(1).title);
    return l_tab;
  end;

end ;

  /
  select * from TABLE(PKG_BORROW.get_adv_header_filter('a','a','a','a'));

  /
  declare
     TYPE CurTyp  IS REF CURSOR;
  v_adv_cursor    CurTyp;
  begin 
  open v_adv_cursor for PKG_BORROW.get_adv_header_filter('a','a','a','a');

  end;

更新:嗯,我使我的代码更简单,但我仍然有 00902 错误“无效数据类型”。我在下面显示的新代码:

     create or replace package PKG_BORROW as
    type adv_head_tab is table of ADVERTISEMENT%ROWTYPE;
   function get_adv_header_filter
  return adv_head_tab;

  end ;

  /
  create or replace package body PKG_BORROW 
  as

  function get_adv_header_filter
  return adv_head_tab as
  l_tab adv_head_tab := adv_head_tab();
  query varchar2(500);
   TYPE CurTyp  IS REF CURSOR;
  v_adv_cursor    CurTyp;

 begin
    query:='select * from ADVERTISEMENT';

    open v_adv_cursor for query;

    fetch v_adv_cursor bulk collect into l_tab;

   close v_adv_cursor;


   for rec in 1..l_tab.count
   loop        
     dbms_output.put_line(l_tab(rec).title);
   end loop;

    return l_tab;
  end;
end ;

  /
  select  * from TABLE(PKG_BORROW.get_adv_header_filter);

关于无效数据类型的错误仍然存​​在。

【问题讨论】:

PL/SQL 表不是游标。 【参考方案1】:

你的功能有问题。您正在尝试将游标值插入循环中的集合。您需要进行批量收集。见下文:

 function get_adv_header_filter
  (title varchar2,username varchar2,regionName varchar2,categoryName varchar2)
  return adv_head_tab as
  l_tab adv_head_tab := adv_head_tab();
  query varchar2(500);
   TYPE CurTyp  IS REF CURSOR;
  v_adv_cursor    CurTyp;

  begin
    query:='select a.id_advertisement,a.title,a.date_added,a.id_user,r.name,i.id_item_category from advertisement a,region r,item_category i
    where a.id_region=r.id_region and a.id_item_category=i.id_item_category ';

    open v_adv_cursor for query;

    fetch v_adv_cursor bulk collect into l_tab;

   close v_adv_cursor;


   for rec in 1..l_tab.count
   loop        
     dbms_output.put_line(l_tab(rec).title);
   end loop;

    return l_tab;
  end;

【讨论】:

感谢您的回答 - 您的固定代码有效。我还有其他问题 - 你看到我代码底部的选择了吗?这个选择的执行没有运行->无效数据类型错误,所以我不能运行它。函数调用中的参数并不重要——只是我想运行这种类型的选择。当我将结构放在架构级别时,我收到了以下错误:“不一致的数据类型:预期的 %s 得到了 %s”。提前致谢。 检查您的 record 列数据类型是否与 select 语句中选择的列匹配。

以上是关于从 PL/SQL 函数返回表 - 不正确的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g

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

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

带有参数的 PL/SQL 过程/函数从选择查询返回表

如何从 Oracle PL/SQL 函数中返回现有表中的记录?

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