将对象存储在类型表行中

本主题提供有关在带类型表行中存储对象的信息。

关于本任务

将对象存储在表行中时,该表的每一列中都包含此对象的一个属性。 正如非类型表一样,必须为所有定义为 NOT NULL 的列(其中包括对象标识列)提供数据。 因为对象标识列属于 REF 类型(它具有强类型化特征),所以您必须使用系统生成的强制类型转换函数(它是在您创建结构化类型时为您创建的)对用户提供的对象标识值进行强制类型转换。 例如,可以将人员的实例存储在一个包含姓名列和年龄列的表中。 首先,以下是一个用于存储 Person 的实例的 CREATE TABLE 语句。

   CREATE TABLE Person OF Person_t
      (REF IS Oid USER GENERATED)

要将 Person 的实例插入表中,可以使用以下语法:

   INSERT INTO Person (Oid, Name, Age)
      VALUES(Person_t('a'), 'Andrew', 29);
表 1. Person 类型表
Oid 姓名 年龄 地址
a Andrew 29  

程序通过访问此类型表的列来访问此对象的属性:

   UPDATE Person
      SET Age=30
      WHERE Name='Andrew';

完成上述 UPDATE 语句之后,此表看起来为如下所示:

表 2. 更新之后的 Person 类型表
Oid 姓名 年龄 地址
a Andrew 30

因为 Person_t 有一个称为 Employee_t 的子类型,所以不能将 Employee_t 的实例存储在 Person 表中,而必须将它存储在子表中。 以下 CREATE TABLE 语句将在 Person 表中创建 Employee 子表:

   CREATE TABLE Employee OF Employee_t UNDER Person
      INHERIT SELECT PRIVILEGES
      (SerialNum WITH OPTIONS NOT NULL,
      Dept WITH OPTIONS SCOPE BusinessUnit);

并将它插入 Employee 表中,看起来为如下所示:

   INSERT INTO Employee (Oid, Name, Age, SerialNum, Salary)
      VALUES (Employee_t('s'), 'Susan', 39, 24001, 37000.48)
表 3. Employer 类型子表
Oid 姓名 年龄 地址 SerialNum 薪水 部门
s Susan 39   24001 37000.48  

如果您运行以下查询,那么将返回 Susan 的信息:

   SELECT *
      FROM Employee
      WHERE Name='Susan';

只需通过对 Person 表执行 SQL 语句,您就可以访问职员和人员的实例。 此功能称为可替换性。 通过对包含类型层次结构中位于较高层的实例的表执行查询,就可以自动获得层次结构中位于较低层的类型的实例。 换句话说,Person 表在逻辑上看起来类似于 SELECT、UPDATE 和 DELETE 语句的此表:

表 4. 包含 Person 和 Employee 实例的 Person 表
Oid 姓名 年龄 地址
a Andrew 30 (空)
s Susan 39 (空)

如果您运行以下查询,那么将同时获得有关 Andrew(一个人员)和 Susan(一个职员)的对象标识和 Person_t 信息:

   SELECT *
      FROM Person;