如何在表中使用Oracle Collection of Record类型?

时间:2015-04-19 06:33:59

标签: oracle collections record user-defined-types

我正在尝试探索Oracle Collection and Record类型。他们是如何工作的?我写下面的脚本,但无法编译它们。这有什么不对?

create or replace package pkg is
type ty_rec is record(empno emp.empno%type,ename emp.ename%type,sal emp.sal%type);
end pkg;
/
create or replace package body pkg is 
end pkg;
/
create or replace type ty_varray is varray(5) of pkg.ty_rec;
/
create or replace type ty_table is table of pkg.ty_rec;
/
create table tab1(
id number,
col_arr ty_varray,
col_tab ty_table
) nested table col_tab store as tab1_col_tab;
/

此外,当我们在表格列中使用它们时,任何人都可以解释嵌套表格与Varray。他们如何存储数据以及哪一个更快?

注意:我使用的是scott架构,它具有默认的 \ temp

1 个答案:

答案 0 :(得分:3)

记录是PL / SQL构造。这意味着它们不能在纯SQL语句中使用。所以你需要创建"记录"键入纯SQL对象:

create or replace type ty_emp_rec as object 
(empno number
  ,ename varchar2(20)
  ,sal number);
/

create or replace type ty_emp_varray is varray(5) of ty_emp_rec;
/
create or replace type ty_emp_table is table of ty_emp_rec;
/

我同意如果您的代码有效,它会非常整洁,尤其是因为使用%TYPE语法定义属性的能力非常有用。但是唉,这也仅限于PL / SQL引擎。

此限制取决于使用用户定义类型声明堆表列的能力,如上一个示例所示。 Oracle要求其列是强类型的。 %TYPE语法会在此处产生各种问题:考虑如果emp.empno从NUMBER更改为VARCHAR2会发生什么,反之亦然。