将对象存储在类型表行中
本主题提供有关在带类型表行中存储对象的信息。
关于本任务
将对象存储在表行中时,该表的每一列中都包含此对象的一个属性。 正如非类型表一样,必须为所有定义为 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);
| Oid | 姓名 | 年龄 | 地址 |
|---|---|---|---|
| a | Andrew | 29 |
程序通过访问此类型表的列来访问此对象的属性:
UPDATE Person
SET Age=30
WHERE Name='Andrew';完成上述 UPDATE 语句之后,此表看起来为如下所示:
| 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)
| Oid | 姓名 | 年龄 | 地址 | SerialNum | 薪水 | 部门 |
|---|---|---|---|---|---|---|
| s | Susan | 39 | 24001 | 37000.48 |
如果您运行以下查询,那么将返回 Susan 的信息:
SELECT *
FROM Employee
WHERE Name='Susan';只需通过对 Person 表执行 SQL 语句,您就可以访问职员和人员的实例。 此功能称为可替换性。 通过对包含类型层次结构中位于较高层的实例的表执行查询,就可以自动获得层次结构中位于较低层的类型的实例。 换句话说,Person 表在逻辑上看起来类似于 SELECT、UPDATE 和 DELETE 语句的此表:
| Oid | 姓名 | 年龄 | 地址 |
|---|---|---|---|
| a | Andrew | 30 | (空) |
| s | Susan | 39 | (空) |
如果您运行以下查询,那么将同时获得有关 Andrew(一个人员)和 Susan(一个职员)的对象标识和 Person_t 信息:
SELECT *
FROM Person;