我有以下对象:
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 :(得分: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
。