暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

11gr2增强CREATE OR REPLACE TYPE功能

老杨 2019-04-18
1202

问题描述

11.2对于CREATE OR REPLACE TYPE语句进行了增加,增加了FORCE选项。
在11.2之前,只要有其他的表或TYPE依赖了当前对象,这个对象就无法进行REPLACE了:

SQL> CREATE TYPE t_num_tab IS TABLE OF NUMBER;
2 /
TYPE created.
SQL> CREATE TYPE t_record IS object (id NUMBER, n_tab t_num_tab);
2 /
TYPE created.
SQL> CREATE OR REPLACE TYPE t_num_tab IS TABLE OF NUMBER(5);
2 /
CREATE OR REPLACE TYPE t_num_tab IS TABLE OF NUMBER(5);
*
ERROR at line 1:
ORA-02303: cannot DROP OR REPLACE a TYPE WITH TYPE OR TABLE dependents


专家解答

这是11.2之前的情况,尝试执行CREATE OR REPLACE将会导致ORA-2303错误,在11.2中Oracle增加了FORCE功能,使得一个仅被TYPE所依赖的对象仍然可以执行REPLACE的操作:

SQL> CREATE OR REPLACE TYPE t_num_tab force IS TABLE OF NUMBER(5);
2 /
TYPE created.
SQL> SELECT * FROM v$version;
BANNER
--------------------------------------------------------------------------------
Oracle DATABASE 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS FOR Solaris: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

有意思的是,FORCE语句的位置不对则不会生效,这时同样会报ORA-2303的错误,而并不会导致语句错误:

SQL> CREATE OR REPLACE force TYPE t_num_tab IS TABLE OF NUMBER(5);
CREATE OR REPLACE force TYPE t_num_tab IS TABLE OF NUMBER(5)
*
ERROR at line 1:
ORA-02303: cannot DROP OR REPLACE a TYPE WITH TYPE OR TABLE dependents
 
SQL> CREATE OR REPLACE TYPE t_num_tab IS TABLE OF NUMBER(5) force;
2 /
CREATE OR REPLACE TYPE t_num_tab IS TABLE OF NUMBER(5) force;
*
ERROR at line 1:
ORA-02303: cannot DROP OR REPLACE a TYPE WITH TYPE OR TABLE dependents

最后这个功能只对被TYPE所依赖的对象有效,一旦对象被表所依赖,则FORCE功能也不起作用:

SQL> CREATE TABLE t_type_tab (id NUMBER, c_tab t_num_tab)
2 nested TABLE c_tab store AS c_tab_tab;
TABLE created.
SQL> CREATE OR REPLACE TYPE t_num_tab force IS TABLE OF NUMBER(6);
2 /
CREATE OR REPLACE TYPE t_num_tab force IS TABLE OF NUMBER(6);
*
ERROR at line 1:
ORA-22866: cannot REPLACE a TYPE WITH TABLE dependents

Oracle的错误信息也变成了ORA-22866。其实这时可以预料的,因为一旦创建了表,就相当于进行了实体化的工作,如果依赖的类型发生了变化,将会影响表中已有的数据的读写。不过其实Oracle可以做到更进一步,就是如果表段没有创建或者表中没有插入数据的情况下,允许对依赖的对象进行修改。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论