类型视图

当要对两个显示同一数据类型的数据的视图加以区分时,可创建带类型视图。例如:假定要对下面这个表创建两个视图:
CREATE TABLE emp
(  name    VARCHAR(30),
      age     INTEGER,
      salary  INTEGER);
下列语句对 emp 表创建两个带类型视图 name_agename_salary
CREATE ROW TYPE name_age_t
(  name    VARCHAR(20),
      age    INTEGER);

CREATE VIEW name_age OF TYPE name_age_t AS
      SELECT name, age FROM emp;

CREATE ROW TYPE name_salary_t
(  name    VARCHAR(20),
      salary  INTEGER);

CREATE VIEW name_salary OF TYPE name_salary_t AS
      SELECT name, salary FROM emp

创建带类型视图时,该视图显示的数据具有命名行类型。例如:name_agename_salary 视图包含 VARCHAR 和 INTEGER 数据。由于视图带有类型,所以对 name_age 视图执行的查询返回类型为 name_age 的列视图,而对 name_salary 视图执行的查询返回类型为 name_salary 的列视图。因此,数据库服务器能够对 name_agename_salary 视图返回的行加以区分。

在某些情况下,带类型视图具有无类型视图所不具有的优点。例如:假定按如下方式重载 myfunc() 函数:
CREATE FUNCTION myfunc(aa name_age_t) ......;
CREATE FUNCTION myfunc(aa name_salary_t) .....;
由于 name_agename_salary 视图是带类型视图,所以下列语句将解析为适当的 myfunc() 函数:
SELECT myfunc(name_age) FROM name_age; 
SELECT myfunc(name_salary) FROM name_salary;
您还可以使用表名的别名来编写上述 SELECT 语句:
SELECT myfunc(p) FROM name_age p; 
SELECT myfunc(p) FROM name_salary p;

如果不将两个包含相同数据类型的视图创建为带类型视图,那么数据库服务器无法对这两个视图显示的行加以区分。有关函数重载的更多信息,请参阅 GBase 8s 用户定义的例程与数据类型开发者指南