在 oracle 中更改 TYPE 时级联有何作用?

问题描述 投票:0回答:1

我想弄清楚下面语句中的 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 被改变了。表中没有任何变化。

sql oracle plsql
1个回答
1
投票

来自

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

因此,您认为表的列没有更改是正确的;但你也错了,因为某些事情已经发生了变化,现在表中的对象可以有一个附加属性。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.