【问题标题】:Nested table in oracle giving errororacle中的嵌套表给出错误
【发布时间】:2013-04-25 16:30:38
【问题描述】:

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

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"

【问题讨论】:

    标签: oracle oracle11g


    【解决方案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,则针对employee_info_tyinvalid datatype 错误消失,但被另一个错误取代:

    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_ty 重新用于store as 子句,因为这是您刚刚创建的对象类型;你会得到一个 ORA-00955。这有效:

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

    来自 cmets 中的问题,如果您填充如下一行:

    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 存储为字符串。

    【讨论】:

    • 已创建表employee_info,但我如何访问家属的属性。我可以访问其他对象的属性。
    • @AbhiruchiSharma - 添加了插入/选择示例。
    猜你喜欢
    • 2019-10-02
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多