如何从oracle中的函数返回值表

时间:2013-12-09 06:25:55

标签: oracle function plsql user-defined-types

我已经尝试了一些答案,无法使我的代码工作: 这就是我想要的,这就是我所做的: 我有一个两列类型的表,我想使用函数查询该表,以返回完全相同的表,以路由到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

2 个答案:

答案 0 :(得分:2)

您收到这些编译消息,因为您的代码中存在多个语法错误。 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;
/

答案 1 :(得分:0)

在return语句中尝试不带()并添加一个结尾;最后。

return temp_list; 

end;

另外,您可能需要查看所谓的流水线函数: http://www.oracle-base.com/articles/misc/pipelined-table-functions.php