【问题标题】:CREATE OR REPLACE TYPE with Type and Table Dependencies使用类型和表依赖关系创建或替换类型
【发布时间】:2013-05-20 17:44:11
【问题描述】:

在提交此问题之前,我已经查看了有关此主题的 Oracle 文档: Using CREATE OR REPLACE TYPE with Type and Table Dependencies

但仍然没有解决我的错误。

我创建了一些对象类型:

CREATE OR REPLACE TYPE SchoolMember AS OBJECT (
    ...
) NOT FINAL;
/

CREATE OR REPLACE TYPE Teacher UNDER SchoolMember (
   ...
);
/

CREATE OR REPLACE TYPE Curse AS OBJECT (
   ...
   refTeacher REF Teacher,
   ...
);
/

假设我要修改 Teacher 对象类型添加构造函数:

CREATE OR REPLACE TYPE Teacher UNDER SchoolMember (
   ...
   CONSTRUCTOR FUNCTION Teacher(...) RETURN SELF AS RESULT
);
/

CREATE OR REPLACE TYPE BODY Teacher AS
...
END;
/

我得到 ORA-02303: cannot drop or replace a type with type or tabledependent,因为在 Curse 对象类型本身中使用了 Teacher 类型。

修改继承的对象类型(本例中为教师)时,我应该将 FORCE 选项放在哪里? 我尝试了几种方法,但都没有奏效:

CREATE OR REPLACE TYPE Teacher FORCE UNDER SchoolMember

CREATE OR REPLACE TYPE Teacher UNDER SchoolMember FORCE

但是ORA-02303错误依然存在

【问题讨论】:

    标签: oracle oop plsql


    【解决方案1】:

    我无法准确重现您的问题。

    原始对象

    SQL> CREATE OR REPLACE TYPE SchoolMember AS OBJECT (a number) NOT FINAL;
      2  /
    
    Type created.
    
    SQL> CREATE OR REPLACE TYPE Teacher UNDER SchoolMember (b number);
      2  /
    
    Type created.
    
    SQL> CREATE OR REPLACE TYPE Curse AS OBJECT (refTeacher REF Teacher);
      2  /
    
    Type created.
    

    不使用 FORCE 创建失败

    SQL> CREATE OR REPLACE TYPE Teacher UNDER SchoolMember (
      2     b number,
      3     CONSTRUCTOR FUNCTION Teacher RETURN SELF AS RESULT
      4  );
      5  /
    CREATE OR REPLACE TYPE Teacher UNDER SchoolMember (
    *
    ERROR at line 1:
    ORA-02303: cannot drop or replace a type with type or table dependents
    

    用 FORCE 作品创作

    SQL> CREATE OR REPLACE TYPE Teacher FORCE UNDER SchoolMember (
      2     b number,
      3     CONSTRUCTOR FUNCTION Teacher RETURN SELF AS RESULT
      4  );
      5  /
    
    Type created.
    

    更新

    CREATE TYPEFORCE 选项已在 11gR2 中添加。您可以在this11gR2 语法图中看到它,但在this11gR1 图中看不到。

    在您的情况下,您需要先删除类型,然后再重新创建它。

    SQL> DROP TYPE Teacher VALIDATE;
    
    Type dropped.
    

    【讨论】:

    • 不涉及任何表。您没有收到 ORA-02303 错误,因为创建对象类型 Curse 时出现编译错误(它只有一个属性,您写了一个多余的逗号)。
    • 糟糕,抱歉。我更新了我的示例,它适用于您的 FORCE 语法。
    • 它对我不起作用。我正在使用 Oracle Database 10g Express Edition Release 10.2.0.1.0 - 生产
    【解决方案2】:

    使用 force 选项删除类型并执行您的代码。它会工作

    DROP TYPE Teacher VALIDATE FORCE;
    
    SQL> CREATE OR REPLACE TYPE Teacher UNDER SchoolMember (
           b number,
           CONSTRUCTOR FUNCTION Teacher RETURN SELF AS RESULT
        );
    

    类型已创建。

    【讨论】:

    • 小心使用FORCEDROP TYPE,它可能会改变表并丢失数据!
    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多