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

How to use Oracle Collection of Record type in table?

我试图探索 Oracle 集合和记录类型。它们是如何工作的?我写了下面的脚本,但无法编译它们。这里有什么问题?

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;
/

此外,当我们在 table 列中使用 Nested Table 与 Varray 时,任何人都可以解释它们。他们如何存储数据,哪个更快?

注意:我使用的是 scott 模式,它具有默认值 emp table

记录是一种PL/SQL结构。这意味着它们不能用于纯 SQL 语句。因此,您需要将 "record" 类型创建为纯 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 引擎。

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