您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

%ROWTYPE 属性语法

将数据类型设为特定表、视图、表引用变量或游标中的行的复合数据类型。

语法

%ROWTYPE 

| ROWTYPE OF ( )

:

[ . ]{ | }

|

| TABLE REF ( )

参数

  • <table-name>表的名称。指定 <table-name> 时,%ROWTYPE 变量的数据类型由 <table-name> 中列的数据类型组成。

  • <view-name>已启用视图(包括实例化视图)的名称。实例化视图也必须进行初始化。指定 <view-name> 时,%ROWTYPE 变量的数据类型由 <view-name> 中列的数据类型组成。

  • <cursor-name>游标的名称。指定 <cursor-name> 时,%ROWTYPE 变量的数据类型由游标的选择项目的数据类型组成。

  • <table-reference-variable>表引用变量的名称。指定表引用变量时,%ROWTYPE 变量的数据类型由 <table-reference-variable> 中引用的表的列的数据类型组成。

    注释

    创建 %ROWTYPE 变量时,其它属性(如缺省值、约束以及是否允许 NULL)不属于继承的定义的一部分,并且必须进行单独指定。

  • 通过表、视图或游标引用来指定 %ROWTYPE 时的限制:创建或更改过程、视图和域时,%ROWTYPE 指定中引用的对象必须为永久对象。引用临时表将返回错误。如果您声明了一个行变量且 %ROWTYPE 结构的参数是一个尚未打开的游标,则如果任何基础对象发生更改,游标的模式在打开时将发生变化。基于已经打开的游标来声明行变量会更为安全。当 %ROWTYPE 在 IS OF 搜索表达式、FROM 子句中的 WITH 表达式或 CAST 或 CONVERT 函数中指定时,引用的项目必须为永久对象。指定临时表、相关名或派生表将返回错误。 当 引用一个游标时,游标中的项目名称(例如,列名称)必须为简单名称或别名。如果无法成功派生游标中的选择列表项名称,则将返回错误。 定义或声明变量时,如果 的标识符部分为以下各项之一,则标识符部分必须带引号: INOUTINOUTDYNAMICSCROLLNOINSENSITIVESENSITIVETIMESTAMP以 # 开头的标识符

  • IN

  • OUT

  • INOUT

  • DYNAMIC

  • SCROLL

  • NO

  • INSENSITIVE

  • SENSITIVE

  • TIMESTAMP

  • 以 # 开头的标识符

  • 通过表引用变量指定 %ROWTYPE 时的限制 (TABLE REF (<table-reference-variable>) %ROWTYPE):创建或更改过程、视图和域时,不支持通过表引用变量指定 %ROWTYPE。类似地,在 IS OF 搜索表达式、FROM 子句中的 WITH 表达式或 CAST 或 CONVERT 函数中,也不支持通过表引用变量指定 %ROWTYPE。 当 引用一个表引用变量时,表引用变量必须在处理 %ROWTYPE 时已进行初始化。如果在批处理或过程中的语句内使用 TABLE REF (<table-reference-variable>) %ROWTYPE,则在为表引用变量分配值或将其作为参数传递后,该语句必须嵌套在另一个 BEGIN...END 块中。

    特权

    无。

    副作用

    无。

    标准

  • ANSI/ISO SQL 标准不符合标准。

    示例

    除了以下示例,在 SQL 语句和函数的文档中还有其它支持指定 %ROWTYPE 属性的示例。

    以下示例创建新变量 ItemsForSale,并使用 %ROWTYPE 属性将其数据类型设为由为 Products 表定义的列组成的复合数据类型:

    CREATE VARIABLE ItemsForSale Products%ROWTYPE;

    以下语句声明变量 cust_rec,并将其数据类型设为 Customers 表中行的复合数据类型:

    CREATE OR REPLACE PROCEDURE DepartmentsCloseToCustomerLocation( IN customer_ID Customers.ID%TYPE )
    

    BEGIN

    DECLARE cust_rec Customers%ROWTYPE;

    SELECT City, State, Country

    INTO cust_rec.City, cust_rec.State, cust_rec.Country

    FROM Customers

    WHERE ID = customer_ID;

    SELECT Employees.Surname, Employees.GivenName, Departments.DepartmentName

    FROM Employees JOIN Departments

    ON Departments.DepartmentHeadID = Employees.EmployeeID

    WHERE Employees.City = cust_rec.City

    AND Employees.State = cust_rec.State

    AND Employees.Country = cust_rec.Country;

    END;

    CALL DepartmentsCloseToCustomerLocation(158);