oracle如何从函数中返回值表

Posted

技术标签:

【中文标题】oracle如何从函数中返回值表【英文标题】:How to return a table of values from a function in oracle 【发布时间】:2013-12-09 06:25:55 【问题描述】:

我已经尝试了一些答案,但无法使我的代码工作: 这就是我想要的,这就是我所做的: 我有一个两列类型的表,我想使用函数查询该表以返回完全相同的表以路由到 VB.NET,以便我可以在 DatagridView 控件中显示它。 我是 PL/SQL 的新手,这对我来说是个问题。 我打算解决的第一个问题是创建函数。

-- DECLARE A RECORD TYPE
create or replace type shipper_type AS OBJECT
(
shipper_id number,  shipper_name varchar2(7)
);
/

CREATE TYPE t_shipper as table of shipper_type;
/

    create or replace function get_shipper return t_shipper is 
    temp_list t_shipper:= t_shipper();
    is  
     --  shipper_record shipper_type;
    begin
      for i in (  (select shipper.shipper_id, shipper.shipper_name) list from shipper) 
      loop
        temp_list.extend;
      temp_list(temp_list.last):= t_shipper(list);   
    end loop;

    return(temp_list);
   end get_shipper;
   /

当我尝试编译此代码时,我收到以下错误: FUNCTION GET_SHIPPER 的错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/1      PLS-00103: Encountered the symbol "IS" when expecting one of the
         following:
         begin function pragma procedure subtype type <an identifier>
         <a double-quoted delimited-identifier> current cursor delete
         exists prior

6/63     PLS-00103: Encountered the symbol ")" when expecting one of the
         following:
         . ( , * @ % & - + / at mod remainder rem <an identifier>
         <a double-quoted delimited-identifier> <an exponent (**)> as
         from || multiset

【问题讨论】:

【参考方案1】:

您收到这些编译消息是因为您的代码中有几个语法错误。 IS 的两个实例,缺少select 中的类型,return 中那些不必要的括号。你可以纠正这些,但你也应该简化你的代码。

填充嵌套表的最简单方法是使用批量收集。

create or replace function get_shipper return t_shipper is 
    temp_list t_shipper:= t_shipper();
begin
    select shipper_type(shipper.shipper_id, shipper.shipper_name) 
    bulk collect into temp_list
    from shipper;

    return temp_list ;
end get_shipper;
/

【讨论】:

如果这解决了您的问题,您应该接受它作为正确的解决方案。 Find out how【参考方案2】:

在return语句中不带()试试,加个end;最后。

return temp_list; 

end;

您可能还想看看所谓的流水线函数: http://www.oracle-base.com/articles/misc/pipelined-table-functions.php

【讨论】:

以上是关于oracle如何从函数中返回值表的主要内容,如果未能解决你的问题,请参考以下文章

如何从从 plsql 函数 ORACLE 返回的游标中进行选择

从 Oracle 12c 函数返回多个值

从 oracle 函数返回布尔值

从 Oracle 函数返回多个值

从游标返回表

Oracle 函数调用的返回值返回 null