0

我无法创建嵌套表。我执行了以下命令:

create or replace type address_ty as object(
    street nvarchar2(15),
    city nvarchar2(15),
    district nvarchar2(15));

create or replace type name_ty as object(
    name nvarchar2(15),
    address address_ty);

create or replace type dependent_ty as object(
    relation nvarchar2(15),
    name name_ty,
    age number);

create or replace type dependent_list as table of dependent_ty;

create or replace type employee_info_ty as object(
    emp_id nvarchar(15),
    name name_ty,
    salary nvarchar(15),
    dept_id nvarchar(15),
    dependents dependent_list);

当我创建一个表时,它给出了一个错误:

create table employee_info of employee_info_ty OIDINDEX OID_EMPLOYEE_INFO
nested table dependent store as dependent_ty;

SQL Error: ORA-00902: invalid datatype
00902. 00000 -  "invalid datatype"
4

1 回答 1

1

您的最后一个类型声明无效:

create or replace type employee_info_ty as object(
    emp_id nvarchar(15),
    name name_ty,
    salary nvarchar(15),
    dept_id nvarchar(15),
    dependents dependent_list);
/

Warning: Type created with compilation errors.

show errors

Errors for TYPE EMPLOYEE_INFO_TY:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
2/12     PLS-00201: identifier 'NVARCHAR' must be declared

如果将其更改为使用,nvarchar2则针对的invalid datatype错误employee_info_ty会消失,但会被另一个错误替换:

create or replace type employee_info_ty as object(
    emp_id nvarchar2(15),
    name name_ty,
    salary nvarchar2(15),
    dept_id nvarchar2(15),
    dependents dependent_list);
/

Type created.

create table employee_info of employee_info_ty OIDINDEX OID_EMPLOYEE_INFO
nested table dependents store as dependent_ty;

nested table dependent store as dependent_ty
             *
ERROR at line 2:
ORA-00904: : invalid identifier

dependents...这是因为您在类型定义中调用了嵌套表,但dependent在这里。您也不能重复使用dependent_tystore as子句,因为这是您刚刚创建的对象类型;你会得到一个 ORA-00955。这有效:

create table employee_info of employee_info_ty OIDINDEX OID_EMPLOYEE_INFO
nested table dependents store as dependents_tab;

Table created.

从评论中的问题,如果您填充如下行:

insert into employee_info values (
    employee_info_ty('1', name_ty('Joe Bloggs',
            address_ty('1 Main Street', 'Omaha', 'Nebraska')),
        '20000', '2', dependent_list(dependent_ty('Daughter',
            name_ty('Emily Bloggs',
                address_ty('1 Main Street', 'Omaha', 'Nebraska')),
            '14')
        )
    )
);

您可以选择直接属性,例如:

select e.emp_id, e.name.name
from employee_info e;

EMP_ID          NAME.NAME
--------------- ---------------
1               Joe Bloggs

和嵌套属性,如:

select d.relation, d.name.name, d.age
from the(select e.dependents from employee_info e where emp_id = '1') d;

RELATION        NAME.NAME              AGE
--------------- --------------- ----------
Daughter        Emily Bloggs            14

我想你是在 PL/SQL 中操作这些,但原理是一样的。

不知道你为什么要存储emp_idsalary作为字符串。

于 2013-04-24T12:03:03.983 回答