oracle 创建涉及继承的嵌套表出错

kmbjn2e3  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(119)

我有一个有点复杂的结构如下:

create or replace type user_typ as object(
  user_id number(19,0),
  username nvarchar2(40 char)
);

我从下面继承了一个applicant_typ:

create or replace type applicant_typ under user_typ (
  resume_text nclob
);

我的设计涉及申请人可以申请的工作。为此,我创建了一个application_typ,如下所示:

create or replace TYPE Application_typ AS OBJECT (
  application_id NUMBER,
  candidate applicant_typ,
  time_of_app DATE
);

CREATE TYPE Application_tab IS TABLE OF Application_typ;

现在我想创建一个名为Job_typ的对象类型,以及一个包含这些对象的表,其中将有一个用于应用程序的嵌套表:

CREATE OR REPLACE TYPE Job_typ AS OBJECT (
  job_ID NUMBER,
  company_ID NUMBER,
  description NVARCHAR2(1000),
  name NVARCHAR2(200),
  application Application_tab,
  MAP MEMBER FUNCTION job_no RETURN NUMBER,
  MEMBER PROCEDURE no_of_applicants 
);

所有这些都很好。问题是当我尝试创建Job_typ类型的表时:

CREATE TABLE Job_tab OF Job_typ 
NESTED TABLE application STORE AS application_nt;

这不起作用,给出错误:

SQL Error: ORA-02320: failure in creating storage table for nested table column APPLICATION
ORA-22913: must specify table name for nested table column or attribute
02320. 00000 -  "failure in creating storage table for nested table column %s"
*Cause:    An error occurred while creating the storage table for the
       specified nested table column.

我做错了什么?
答:我尝试了一些不同的东西。如果我按如下方式更改application_typ:

CREATE OR REPLACE TYPE Application_typ AS OBJECT (
  application_id NUMBER,
  candidate User_Typ, -- NOTE: This attribute is now of type User_typ instead of the inherited type
  time_of_app DATE,
);

 CREATE TYPE Application_tab IS TABLE OF Application_typ;

然后,其他一切工作正常,我就可以创建Job表了。为什么我在使用继承类型时会出现错误?

rdrgkggo

rdrgkggo1#

我在Oracle www.example.com中尝试了以下操作11.2.0.1,没有得到任何错误。我做了一个小小的改变:

CREATE OR REPLACE TYPE user_typ AS OBJECT
(
    user_id NUMBER (19, 0),
    username NVARCHAR2 (40 CHAR)
) NOT FINAL;                            -- << Notice the NOT FINAL keyword

create or replace type applicant_typ under user_typ (
  resume_text nclob
);

CREATE OR REPLACE TYPE Application_typ AS OBJECT
(
    application_id NUMBER,
    candidate applicant_typ,
    time_of_app DATE
);

CREATE TYPE Application_tab IS TABLE OF Application_typ;

CREATE OR REPLACE TYPE Job_typ AS OBJECT
(
    job_ID NUMBER,
    company_ID NUMBER,
    description NVARCHAR2 (1000),
    name NVARCHAR2 (200),
    application Application_tab,
    MAP MEMBER FUNCTION job_no
        RETURN NUMBER,
    MEMBER PROCEDURE no_of_applicants
);

CREATE TABLE Job_tab OF Job_typ
NESTED TABLE application
    STORE AS application_nt;

在尝试创建所有类型和关键字时,我得到了错误:

[Error] PLS-00590 (10.1): PLS-00590: attempting to create a subtype UNDER a FINAL type

这是因为Oracle不允许在FINAL类型上创建子类型。如果没有为基类型定义任何finalizing子句,则默认值为FINAL
阅读更多关于Oracle Docs
如果你是为真实的世界(阅读行业)编写代码,我建议不要使用嵌套表作为列类型。你终其一生都在尝试嵌套和取消嵌套。我建议您尽可能地规范化模式,并在PL/SQL代码块中保留用于操作的嵌套表。

vltsax25

vltsax252#

你的代码是完全正确的,你只需要在你的脚本末尾加上“NOT FINAL”:

create or replace type user_typ as object(
user_id number(19,0),
username nvarchar2(40 char)
)
NOT FINAL;

祝你好运

相关问题