我想弄清楚下面语句中的 CASCADE 应该做什么。
ALTER TYPE test_cascade_type ADD ATTRIBUTE (col2 VARCHAR2(4000)) CASCADE;
我尝试创建一个包含用户定义类型列的表,然后尝试使用级联选项更改类型。
CREATE TYPE test_cascade_type AS OBJECT( col1 NUMBER);
CREATE TABLE test_cascade( col1 test_cascade_type);
ALTER TYPE test_cascade_type ADD ATTRIBUTE (col2 VARCHAR2(4000)) CASCADE;
但只有 TYPE 被改变了。表中没有任何变化。
ALTER TYPE
文档:
dependent_handling_clause
指定数据库如何处理依赖于修改类型的对象。如果省略此子句,则当该类型具有任何依赖类型或表时,
语句将终止。ALTER TYPE
...
CASCADE
将类型更改传播到依赖类型和表。如果在依赖类型或表中发现任何错误,数据库将终止该语句,除非您还指定了
。FORCE
如果您在
和FINAL
之间更改类型的属性,则必须指定此子句以转换相关列和表中的数据。NOT FINAL
如果您有以下类型:
CREATE TYPE test_cascade_type AS OBJECT( col1 NUMBER);
CREATE TYPE test_cascade_table AS TABLE OF test_cascade_type;
CREATE TYPE test_descendent_type AS OBJECT( col1 test_cascade_type );
或者对象派生表:
CREATE TABLE test_cascade OF test_cascade_type;
你使用:
ALTER TYPE test_cascade_type ADD ATTRIBUTE (col2 VARCHAR2(4000));
然后你会得到错误
ORA-22312: must specify either CASCADE or INVALIDATE option
但是:
ALTER TYPE test_cascade_type ADD ATTRIBUTE (col2 VARCHAR2(4000)) CASCADE;
有效。
但只有
被改变了。TYPE
没有任何改变。TABLE
如果您有:
CREATE TABLE test_cascade1 ( obj1 test_cascade_type );
INSERT INTO test_cascade1 (obj1) VALUES (test_cascade_type(1));
并且您更改类型,然后
test_cascade1
仍然只有一个 obj1
列,但该类型现在将具有两个属性而不是一个。
SELECT t.obj1.col1,
t.obj1.col2
FROM test_cascade1 t
输出:
OBJ1.COL1 | OBJ1.COL2 |
---|---|
1 | 空 |
因此,您认为表的列没有更改是正确的;但你也错了,因为某些事情已经发生了变化,现在表中的对象可以有一个附加属性。