Oracle记录类型vs对象

时间:2017-10-09 06:21:18

标签: oracle object plsql records

我有以下对象:

create type dep_rec_typ as object (did number, dnm varchar2(30));

create type emp_rec_type as object (eid number, enm varchar2(30));

create type emp_tab_typ as table of emp_rec_type;

create type dep_det as object ( dep_det dep_rec_typ         
                              , emp_det emp_tab_typ );

当我使用上述对象运行以下代码时,代码运行完美。

declare
    v_emp emp_rec_type;
    v_dep dep_rec_typ;
    c_dep_dt dep_det;
begin
    select did, dnm
    into v_dep
    where did = 100;

    select eid, enm
    bulk collect into v_emp
    where did = 100;

    select dep_det(v_dep, v_emp)
    into c_dep_dt               
    from   dual;

end;          

但是当我使用RECORDS在包级别创建上述对象时,我面临错误。 请告诉我 1.如何在不使用数据库级别的对象的情况下编写相同的代码。 2.当我在包级别创建RECORDS时,为什么我会遇到错误。

注意:我无法更改任何对象的结构。

2 个答案:

答案 0 :(得分:1)

您可以使用“index by”语句将包头上的对象声明为全局变量,然后您可以像使用对象类型一样在块上使用它。

create or replace package test_types as

  -- Declare the types here
  type type_record is record ( p_id number
                             , p_name varchar2(100));
  type type_tab is table of type_record index by PLS_INTEGER;

  -- Declare the global variables here
  global_rec_type type_record;
  global_tab_type type_tab;

end;

那么你可以像这样使用它

begin

    test_types.global_rec_type.p_id   := 10;
    test_types.global_rec_type.p_name := 'Name in record';

  begin                
    select 1
         , 'Lucas' 
      bulk collect into test_types.global_tab_type
      from dual;
  end;

end;

它不是一个由记录和表格组成的对象,但它具有您想要的相同结果。

答案 1 :(得分:0)

普通的PL / SQL记录没有构造函数。因此,在您的示例中,如果dep_det是记录类型,则不存在dep_det()这样的函数。你必须创建一个,或者命名为new_dep_det,它接受​​两个参数并返回dep_det