DB2 10.5 for Linux, UNIX, and Windows

类型表中的可替换性

对类型表应用 SELECT、UPDATE 或 DELETE 语句时,会将此操作应用于所指定的表及其所有子表。

例如,如果您根据结构化类型 Person_t 来创建类型表并且选择该表中的所有行,那么应用程序不仅可以接收到 Person 类型的实例,而且可以接收到有关 Employee 子类型和其他子类型的实例的 Person 信息。

“可替换性”属性也适用于根据子类型创建的子表。例如,用于 Employee 子表的 SELECT、UPDATE 和 DELETE 语句也适用于 Employee_t 类型以及它自己的子类型。同样,定义为 Address_t 类型的列可以包含美国地址或巴西地址的实例。但是,举例来说,如果要使用 Employee_t 数据来更新 Person_t 行,这并不意味着 UPDATE 语句可以更改行的类型。要使 UPDATE 语句可以更改行的类型,将需要删除 Person_t 行,并将 Employee_t 行作为新类型插入。

要在 SELECT、UPDATE 或 DELETE 语句中限制可替换性,可以使用 ONLY 子句。例如,UPDATE ONLY(Person) SET 将只更新 Person 表中的行,而不会更新它的子表中的行。

相比之下,INSERT 操作仅适用于在 INSERT 语句中指定的表。插入到 Employee 表时,将在 Person 表层次结构中创建 Employee_t 对象。

当您将结构化类型作为参数传递至函数或者作为函数的结果时,也可以替换子类型实例。如果函数具有 Address_t 类型的参数,那么可以传递它的其中一种子类型(例如,US_addr_t)的实例,而不是传递 Address_t 的实例。外部表函数不能返回结构化类型列。

因为虽然使用一种类型定义了某列或表,但是此列或表可能包含子类型的实例,所以,有时候区分用于定义的类型与运行时实际返回的实例类型非常重要。列、行或函数参数中的结构化类型的定义称为静态类型。结构化类型实例的实际类型称为动态类型。要检索有关动态类型的信息,应用程序可以使用 TYPE_NAME、TYPE_SCHEMA 和 TYPE_ID 内置函数。