南大通用GBase8s 常用SQL语句(六十一)

1.1CREATE ROUTINE FROM 语句
使用 CREATE ROUTINE FROM 语句通过引用驻留在单个文件中的 CREATE FUNCTION 语句或 CREATE PROCEDURE 语句的文本来注册 UDR。
该语句是 SQL ANSI/ISO 标准的扩展。
你可以在 ESQL/C 中使用此语句。
语法

元素 描述 限制 语法
file 包含 CREATE PROCEDURE 或 CREATE FUNCTION 语句的全文本的文件的路径名和文件名。缺省路径名为当前目录。 必须存在并且仅能包含一个 CREATE FUNCTION 或 CREATE PROCEDURE 语句 特定于操作系统
file_var 包含文件规范的程序变量的名称 必须是字符数据类型;内容必须满足 file 限制 特定于语言
用法
ESQL/C 程序不能使用 CREATE FUNCTION 或 CREATE PROCEDURE 语句直接定义 UDR 。您可以这样做:
1.使用 CREATE FUNCTION 或 CREATE PROCEDURE 语句创建源文件。
2.在 ESQL/C 程序中执行 CREATE ROUTINE FROM 语句将此源文件的内容发送到数据库服务器用于执行。您指定的文件只能包含一个 CREATE FUNCTION 或 CREATE PROCEDURE 语句。
您提供的文件规范是相对的。如果您不提供路径名,客户端应用程序在当前目录中寻找文件。
如果您不知道编译时文件中的 UDR 是否是一个函数或过程,请使用 GBase 8s ESQL/C 程序中的 CREATE ROUTINE FROM 语句。如果您确实知道 UDR 是否是一个函数或过程,建议您使用匹配语句来存取源文件:
要存取用户定义的函数,请使用 CREATE FUNCTION FROM 。
要存取用户定义的过程,请使用 CREATE PROCEDURE FROM 。
当 IFX_EXTEND_ROLE 配置参数设置成 1 或 ON 时,只有被数据库服务器管理员(DBSA)授权内置 EXTEND 角色的用户才能可以创建外部例程。此外,您对要注册例程所在的数据库必须至少持有的 Resource 存取权限。还必须对编写例程所使用的程序语言拥有 Usage 权限。(有关使用 C 语言将 Usage 特权授予用户或角色的语法,请参阅语言级权限。)
例程使用创建时有效的对照顺序。请参阅 SET COLLATION 语句 获取有关使用非缺省对照的信息。
示例
以下语句通过参考 del_ord.sql 文件中的文本在 UDR 注册。
EXEC SQL CREATE ROUTINE FROM ‘del_ord.sql’;
ESQL/C 源代码示例:
#include

main()
{

printf( "CREATE ROUTINE FROM ESQL Program running.\n\n");
EXEC SQL WHENEVER ERROR STOP;
EXEC SQL connect to 'stores_demo';

EXEC SQL CREATE ROUTINE FROM 'del_ord.sql';

EXEC SQL disconnect current;
printf("\nCREATE ROUTINE Sample Program over.\n\n");

exit(0);
}

del_ord.sql

CREATE FUNCTION delete_order( p_order_num int) RETURNING int, int;
DEFINE item_count int;
SELECT count(*) INTO item_count FROM items
WHERE order_num = p_order_num;
DELETE FROM orders WHERE order_num = p_order_num;
RETURN p_order_num, item_count;
END FUNCTION;
1.2CREATE ROW TYPE 语句
使用 CREATE ROW TYPE 语句创建命名的 ROW 类型。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素 描述 限制 语法
row_type 此处为已命名的新的 ROW 数据类型 请参阅 创建子类型的过程 标识符
supertype 类型继承层次结构中超类型的名称 必须已经作为已命名的 ROW 类型在数据库中存在 数据类型
用法
CREATE ROW TYPE 语句声明已命名的 ROW 数据类型并在当前系统目录中注册。可以将已命名的 ROW 数据类型分配给表或视图,以创建类型表或类型视图。您也可以将列定义为命名 ROW 类型。尽管您能分配一个 ROW 类型到表来定义表模式,但是 ROW 数据类型与表行不同。表行由一个或多个列构成;ROW 数据类型由一个或多个字段构成,使用 Field Definition 语法定义。
已命名的 ROW 数据类型在大多数您可指定数据类型的上下文中有效。已命名的 ROW 类型是强类型。没有两个已命名的 ROW 类型是相等的,即使它们结构上相等。
没有标识符的 ROW 类型称为 unnamed ROW 类型。任何两个未命名 ROW 类型被认为是相等的(如果它们结构上相等)。有关更多信息,请参阅 ROW 数据类型 。
在命名 ROW 类型列上的特权与任何其它列上的特权相同。有关更多信息,请参阅 表级权限。(要查看列上拥有的特权,请检查 syscolauth 系统目录表,该系统目录表在 GBase 8s SQL 参考指南 中有描述。)
如果您包含可选的 IF NOT EXISTS 关键字,则当指定名称的已命名的 ROW 已经在当前数据库中注册时,数据库服务器不采取操作(而非向应用程序发送异常)。
在命名 ROW 数据类型上的特权
在类型表上操作所需的自由访问特权(被指定已命名的 ROW 数据类型的表)与任何表上的特权相等。有关更多信息,请参阅 表级权限。下表显示要创建命名的 ROW 类型必须具有哪些特权。
任务 需要的特权
创建命名 ROW 类型 数据库上的资源特权
按照超类型下子类型创建命名 ROW 类型 在超类型的特权下,以及 Resource 特权
有关 Resource 和 Under 特权以及特权上下文中 ALL 关键字的信息,请参阅GRANT 语句 。
要找出 ROW 类型上存在什么特权,在 sysxtdtypes 系统目录表中检查所有者名称,并在 sysxtdtypeauth 系统目录表中检查可能已经授权给用户或角色的 ROW 类型上的特权。
要找出在给定表上有什么特权,检查 systabauth 系统目录表。有关系统目录表的更多信息,请参阅 GBase 8s SQL 参考指南 。
继承和命名 ROW 类型
已命名的 ROW 类型属于继承层次结构,作为子类型或超类型。使用 CREATE ROW TYPE 语句中的 UNDER 子句将已命名的 ROW 数据类型作为现有的 ROW 数据类型的子类型创建。
超类型必须也是已命名的 ROW 数据类型。如果在现有的超类型下创建已命名的 ROW 数据类型,那么新的类型名称 row_type 称为子类型的名称。
当将命名 ROW 类型创建为子类型时,子类型继承超类型的所有字段。另外,当创建此子类型时,您可以向其添加新的字段。新的字段单独特定于子类型。
不能将继承层次结构中的 ROW 类型替换其超类型或子类型。例如,考虑 person_t 是超类型且 employee_t 是子类型的类型层次结构。如果列是类型 person_t ,则该列仅能包含 person_t 数据。它不能包含 employee_t 数据。同样地,如果列是类型 employee_t ,则列仅能包含 employee_t 数据。它不能包含 person_t 数据。
创建子类型
大多数情况下,当命名 ROW 类型作为另一种命名 ROW 类型(其超类型)的子类型创建时候您添加新的字段。要创建命名的 ROW 类型的字段,请使用 字段定义 中描述的字段定义子句。当创建子类型时,必须使用 UNDER 关键字来将超类型与希望创建的已命名 ROW 类型相关联。下一个示例将在 person_t 类型下创建 employee_t 类型:
CREATE ROW TYPE employee_t (salary NUMERIC(10,2),
bonus NUMERIC(10,2)) UNDER person_t;
employee_t 类型继承 person_t 的所有字段并有两个另外的字段:salary 和 bonus ;但是 person_t 类型没有改变。
类型层次结构
当创建子类型时,会创建类型层次结构。在类型层次结构中每个您创建的子类型从单个超类型继承其属性。如果在 person_t 下创建命名 ROW 类型 customer_t ,customer_t 继承 person_t 的所有字段。如果您在 customer_t 下创建另一个命名 ROW 类型 salesrep_t ,则 salesrep_t 继承 customer_t 的所有字段。
因此,salesrep_t 继承所有 customer_t 从 person_t 继承的字段,以及所有特别为 customer_t 定义的字段。有关类型继承的讨论,请参阅 GBase 8s SQL 教程指南 。
创建子类型的过程
在您将命名 ROW 类型作为继承层次结构中子类型创建之前,请检查以下消息:
验证您已授权创建新的数据类型。必须在数据库上拥有 Resource 特权。可以在 sysusers 系统目录表中找到此信息。
验证超类型存在。可以在 sysxtdtypes 系统目录表中找到此信息。
验证您已授权创建该超类型的子类型。必须拥有超类型上的 Under 特权。可以在 sysusers 系统目录表中找到此信息。
验证您已命名 ROW 类型声明的名称是唯一的。在兼容 ANSI 的数据库中,owner.type 组合必须在数据库中是唯一的。要验证新的数据类型的名称是否唯一的。在不兼容 ANSI 的数据库中,名称必须在数据库中的数据类型名称中是唯一的,要验证新的数据类型的名称是否唯一,请检查 sysxtdtypes 系统目录表,名称必须不是现有数据类型的名称。
如果您正在为 ROW 类型定义字段,则检查没有复制字段名称同时存在于新的和继承的字段中。
重要: 当创建子类型时,不能重新定义它为其超类型继承的字段。如果您试图重新定义这些字段,则数据库服务器返回一个错误。
不能将约束应用到已命名 ROW 数据类型,但是可以在创建或更改使用已命名 ROW 类型的表时指定约束。您也可以在某个单独的 ROW 类型的字段上指定 NOT NULL 约束。
字段定义
使用 Field Definition 子句在已命名的 ROW 类型中定义新的字段。
字段定义

元素 描述 限制 语法
data_type 字段的数据类型 请参阅 对序列和简单大对象数据类型的限制 。 标识符
field row_type 中字段的名称 在此 ROW 类型及其超类型的字段名称中必须是唯一的 标识符
当已命名的 EOW 类型的类型表被创建时,已命名的 ROW 类型字段上的 NOT NULL 约束适用于相应的列。
对序列和简单大对象数据类型的限制
序列和简单大对象数据类型不能嵌套在表中。因此,如果 ROW 类型包含 BYTE 、TEXT 、SERIAL 、BIGSERIAL 或 SERIAL8 字段,则不能使用 ROW 类型在并非基于 ROW 类型的表中定义列。例如,以下代码示例产生一个错误:
CREATE ROW TYPE serialtype (s serial, s8 serial8);
CREATE TABLE tab1 (col1 serialtype); --INVALID CODE
不能创建有存储在单独存储空间中的 BYTE 或 TEXT 值的 ROW 类型。即,不能使用 IN 子句指定存储位置。例如,以下示例产生一个错误:
CREATE ROW TYPE row1 (field1 byte IN blobspace1); --INVALID CODE
表层次结构只能包含一个 SERIAL 、BIGSERIAL 或 SERIAL8 列。如果超级表包含 SERIAL 列,则没有子表能够包含 SERIAL 列。(但是如果没有其它子表包含 BIGSERIAL 或 SERIAL8 列,则子表可以拥有 BIGSERIAL 或 SERIAL8 列。)从而,当创建表层次结构所依据的已命名的 ROW 类型时,它们最多可以包含这些类型中的一个 SERIAL 和一个 BIGSERIAL 或 SERIAL8 字段。
不能用 CREATE ROW TYPE 语句设置起始 SERIAL 、BIGSERIAL 或 SERIAL8 值。要修改序列字段的值,必须使用 ALTER TABLE 语句的 MODIFY 子句或使用 INSERT 语句插入大于当前最大(或缺省)序列值的一个值。 ROW 类型中的序列字段在表层次结构上具有性能影响。要将数据插入超级表(或其超级表)包含序列计数器的子表中,数据库服务器还必须打开超级表,更新序列值并关闭该超级表,从而添加额外开销。
在对 SERIAL 、BIGSERIAL 或 SERIAL8 数据类型发出的限制或性能与您的设计目标冲突的上下文中,可能要考虑使用序列对象来模拟序列字段或序列列的功能。

你可能感兴趣的:(sql,数据库,database)