我正在尝试探索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 表
答案 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会发生什么,反之亦然。