如何检查类型的依赖顺序以删除它们并替换/修改初始类型?

时间:2010-04-12 19:51:33

标签: database oracle plsql

我尝试使用以下代码修改类型,它给了我错误代码:' ORA-02303 '。我对Oracle或PL / SQL了解不多,但我需要解决这个问题。所以我对此表示感谢。

提前致谢。代码只是一个例子。但话说回来,我需要先检查一下家属。

create or replace type A as object (
  x_ number, 
  y_ varchar2(10),
  member procedure to_upper
);
/

5 个答案:

答案 0 :(得分:4)

酌情查看DBA_DEPENDENCIES, ALL_DEPENDENCIES, or USER_DEPENDENCIES

SELECT OWNER, NAME, TYPE
  FROM DBA_DEPENDENCIES 
 WHERE REFERENCED_OWNER = [type owner]
   AND REFERENCED_NAME  = [type name]
   AND REFERENCED_TYPE  = 'TYPE'
/

答案 1 :(得分:3)

不要将DROP与FORCE一起使用,因为它会自动修改表(删除列),而且上帝知道还有什么可以验证所有内容。 使用类似的东西:

ALTER TYPE type_name DROP ATTRIBUTE attr_name INVALIDATE;
ALTER TYPE type_name ADD ATTRIBUTE attr_name varchar2(50) CASCADE;

这将适用于具有表/类型依赖关系的类型。

答案 2 :(得分:2)

如果您在表格中使用了该类型,则应该可以通过以下查询查看:

select * from all_tab_columns
where data_type_owner not in ('SYS');

但我开始关注Alex关于使用ALTER TYPE

的建议

答案 3 :(得分:1)

我确定它可以在某个地方的数据字典中找到,但不确定在哪里;并且您可能有很多不容易解决的依赖项。但您可以改为修改现有类型:http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_4002.htm

还有一个FORCE选项,但仍然可以使依赖对象无效。

答案 4 :(得分:0)

这是由Oracle中的基本限制引起的,这是在数据库中不使用oracle类型的另一个原因。

对于'TYPE'依赖关系,您可以:

  1. DROP TYPE mytype FORCE;
  2. 然后重新创建mytype类型并输入body
  3. 然后DROP TYPE mytype_dependent FORCE;
  4. 然后重新创建mytype_dependent类型并输入body。
  5. 对所有依赖类型和引用类型重复。
  6. 注意:项目3..5是必需的,因为依赖类型无法自动重新编译或“就地”手动编译。

    对于'TABLE'依赖项,您必须:

    使用此处文章中的指导,其中讨论了三个相关方案。

    ORA-02303: cannot drop or replace a type with type or table dependents

    来自Annals of Oracle's Improbable Errors博客