2017-10-09 73 views
0

我有下面的对象:甲骨文记录类型VS对象

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时面临错误。

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

+0

你面临什么错误?你怎么能从包级别调用它? –

+0

嗨我使用记录时遇到的错误是PLS-00597 – Narender

+0

你怎么能从包级别调用它?分享你的执行代码。 –

回答

0

普通PL/SQL记录没有构造函数。因此,在您的示例中,如果dep_det是记录类型,则不存在dep_det()等功能。您将不得不创建一个,可能将其命名为new_dep_det,它带有两个参数并返回dep_det

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; 

它不是exacltly做出记录和表的对象,但它有你想要的结果相同。