南大通用GBase8s 常用SQL语句(四十五)

南大通用GBase8s 常用SQL语句(四十五),第1张

南大通用GBase8s 常用SQL语句(四十五)

南大通用Gbase8s 常用SQL语句(四十五)
1.1CREATE FUNCTION 语句
使用 CREATE FUNCTION 语句创建用户定义函数,注册外部函数,编写并注册 SPL 函数。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素 描述 限制 语法
function 在此定义的函数的名称 您必须拥有相应的语言特权,请参阅 GRANT 语句 和 重载函数名 标识符
owner table_object 的所有者 必须拥有 table_object 所有者名称
pathname 存储编译事件警告的文件的路径名 指定的路径名必须存在于数据库所驻留的计算机之上 路径和文件名必须符合您的 *** 作系统规则
table_object 具有可以调用 function 的触发器的表或视图的名称或同义词 在本地数据库中必须存在 标识符
提示: 如果您尝试从独立文件中的源代码文本创建函数,则使用 CREATE FUNCTION FROM 语句。
用法
Gbase 8s 支持这些语言编写的用户定义的函数:
Gbase 8s 存储过程语言(SPL)。
Gbase 8s 支持的外部语言之一(C 或 Java™)(外部函数)。
当 IFX_EXTEND_ROLE 配置参数设置成 ON 时,只有 DBSA 授予内置 EXTEND 角色的用户才可以创建外部函数。使用 CREATE FUNCTION 语句的其它要求在 使用 CREATE FUNCTION 时必需的特权 中标识。
一个函数可以返回多少值取决于语言。用 SPL 写的函数可以返回一个或多个值。用 C 或 Java 语言写的外部函数必须只返回一个值。但是 C 函数可以返回一个集合类型,而查询的外部函数可以从 OUT 参数(对于 SPL 和 Java 语言,从 INOUT 参数), Gbase 8s 可以将这些参数作为语句-局部变量(SLV)处理。
SPL 函数的 OUT 和 INOUT 参数的返回值可以作为 SLV 处理。您还可以使用 SPL 例程的局部变量或参数从拥有 OUT 或 INOUT 参数的 SPL 或 C 例程检索值。
有关该手册如何使用术语 UDR 、函数和过程以及建议用法的信息,请分别参阅 例程、函数和过程之间的关系 和 使用 CREATE PROCEDURE 与 CREATE FUNCTION 的对比 。
在 ESQL/C 中,只能在 PREPARE 语句中使用 CREATE FUNCTION 语句。如果您想要创建用户定义函数(在编译时按该函数识别文本),则必须将文本放在文件中并用 CREATE FUNCTION FROM 语句指定该文件。
如果您包含了 IF NOT EXISTS 关键字,且指定名称的函数已经在当前数据库中注册,那么数据库服务器不采取任何 *** 作(而不是向应用程序发送异常)。(因为函数的标识符可以被重载,所以如果数据库服务器可以解析新函数的参数列表与当前数据库中任何其它同名函数的参数列表不同,则可能有必要包含这些关键字。)
函数使用在其创建时生效的排列顺序。请参阅 SET COLLATION 语句 获取关于非缺省对照的信息。
使用 CREATE FUNCTION 时必需的特权
必需拥有数据库上的 Resource 特权或 DBA 特权,才能在该数据库中创建函数。
在创建函数之前,您还必须对要编写的函数的程序语言拥有 Usage 特权。当 GRANT USAGE ON LANGUAGE 语授予一个用户或角色语言级别的特权时,它可以指定 SPL 、C 或 Java™ 语言 。有关更多信息,请参阅 语言级权限 。
缺省情况下,SPL 上的 Usage 特权授予 PUBLIC 。
要以 C 或 Java 外部程序语言中注册函数,除非 IFX_EXTEND_ROLE 配置参数设置成 0 或 Off ,否则您还必须持有内置 EXTEND 角色。
已创建函数上的 DBA 关键字和 Execute 特权
如果您用 DBA 关键字创建 UDR ,则它将被称为 DBA 特权 UDR。您需要 DBA 特权创建 DBA 特权 UDR 。
在不拥有 DBA 特权的用户中,只有 DBA 授予 Execute 特权的用户才能调用 DBA 特权 UDR 。然而,如果 DBA 授予 PUBLIC Execute 特权,那么所有的用户都可以使用 DBA 特权 UDR 。有关 DBA 特权 UDR 的其它信息,请参阅创建数据库对象的所有权。
如果您省略 DBA 关键字,则 UDR 将被称为拥有者特权的 UDR 。
当您在兼容 ANSI 的数据库中创建拥有者特权 UDR 时,只有您自己能执行该 UDR 。它的拥有者必须将 Execute 权限授予个别用户或角色或 PUBLIC 后,其它用户才能执行拥有者特权 UDR。
如果您在不兼容 ANSI 的数据库中创建拥有者特权 UDR ,则任何人都可以执行该 UDR,因为缺省地将 Execute 权限授予 PUBLIC 。要让特定用户才能存取拥有者特权 UDR ,则所有者必须撤销 PUBLIC 的对此 UDR Execute 权限,然后将该权限授予指定的用户或角色。将 NODEFDAC 环境变量设置为 yes 可以防止当以 onwer 方式创建 UDR 后缺省地将 URD 的权限授予 PUBLIC。如果该环境变量设置成 yes ,除非,所有者将该 UDR 的 Execute 权限授予其它用户,否则除了该 UDR 所有者其它用户都不能调用此 UDR。
如果外部 C 或 Java™ 语言函数有否定函数,则必须授予对该外部函数及其否定函数的 Execute 权限,然后用户才能执行外部函数。
REFERENCING 和 FOR 子句
REFERENCING 子句可以声明原始值的相关名称和 FOR 子句指定的 table_object 列中的已更改的值相关名称。
REFERENCING 和 FOR 子句

元素 描述 限制 语法
correlation 在此定义的触发器例程中限定旧的或新的列值( correlation.column) 不能是 table_object 标识符
owner table_object 的所有者 必须拥有 table_object 所有者名称
table_object 具有可以调用 function 的触发器的表或视图的名称或同义词 必须存在于本地数据库中 标识符
如果您在 CREATE FUNCTION 语句列表之后立即包含 REFERENCING 和 FOR table_object 子句,则您创建的函数被称为触发器函数(或 触发器 UDR 或 触发器例程)。 FOR 子句指定触发器可以从它们的 Triggered Action 列表的 FOR EACH ROW 部分调用函数的表或视图。
在 REFERENCING 子句中,OLD correlation指定一个前缀,通过该前缀触发器例程可以引用 table_object 列在触发器例程修改列值之前所具有的值。 NEW correlation 指定用于引用触发器例程分配给该列的新值的前缀。无论该触发器例程是否能使用 correlation 名引用 OLD 列值,NEW 列值或者这两种类型的值都取决于正在触发事件的类型:
由 Insert 触发器调用的触发器例程仅能引用 NEW correlation 名称。
由 Delete 触发器或 Select 触发器调用的触发器例程仅能引用 OLD correlation 名称。
由 Update 触发器调用的触发器例程能引用 OLD 和 NEW correlation 名称。
有关如何在触发动作中使用 correlation.column 符号的信息,请参阅 REFERENCING 子句 。
除了任何以 SPL 语言编写 Gbase 8s UDR 的一般需求,触发器例程支持某些附加语法特性,并且受到一定的限制,对于不是触发器例程的一般 UDR ,它们不支持此功能(或者不受此限制):
触发器必须包含 FOR table_object 子句已指定本地数据库中表或视图的名称,该触发器可调用此例程。
触发器例程还可以包含 REFERENCING 子句以声明该相关名称为 OLD 和 NEW 值,它们可被 UDR 中的 SPL 语句引用。
触发器例程只能在触发器定义中的 Triggered Action 列表的 FOR EACH ROW 节被调用。
OLD 或 NEW 值的相关变量可以出现在 SPL 的 IF 语句 和 CASE 表达式中。
OLD 值的相关变量不能在一个 LET 表达式的左边。
如果 FOR 子句指定一个视图,它的 INSTEAD OF 触发动作列表调用该触发器例程,则 NEW 值的相关变量不能在一个 LET 表达式的左边。
只有 NEW 值的相关变量可以在引用相关变量的 LET 表达式的左边从而。然而,在这种情况下,FOR 子句必须指定表而非视图。
OLD 和 NEW 值都可以在一个 LET 表达式的右边。
Boolean 运算符 SELECTING 、INSERTING 、DELETING 和 UPDATING 在具有有效 Boolean 表达式的上下文内的触发器例程中(和只在触发动作语句中调用的触发例程和其它 UDR中)是可用的。如果正在触发的事件符合由此运算符名称引用的 DML *** 作,则这些运算符返回 TRUE (‘t’),否则返回 FALSE(‘f’)。
如果一个正在触发的事件激活了同一表或视图上的多个触发器,则所有的 BEFORE 动作在任何 FOR EACH ROW 动作之前发生,并且所有的 AFTER *** 作在 FOR EACH ROW 动作之后发生。同一事件上不同触发器的执行顺序不被保证。
触发器例程必须用 SPL 语言编写。它们不能用外部语言编写,如 C 或 Java™ 语言,但是它们可以包含到外部语言例程的调用,如:应用程序编程编程接口 mi_trigger ,用于触发器内省。
触发器函数不能引用保存点。由触发动作引起的数据值或数据库结构变更必须被全部提交或全部回滚。 Gbase 8s 不支持触发动作的部分回滚。
有关 mi_trigger API 的更多信息,请参阅 Gbase 8s DataBlade API 程序员指南 和 Gbase 8s DataBlade API 函数参考 。
如果您包含 REFERENCING 子句但省略了 FOR 子句,或者您包含 FOR 子句但省略了 REFERENCING 子句,则 CREATE FUNCTION 语句发生错误而失败。
如果您都省略了 REFERENCING 和 FOR 子句,则 UDR 不能使用 SELECTING 、INSERTING 、DELETING 和 UPDATING 运算符,并且不能声明可以表示和 *** 纵触发器定义指定的表或视图上触发动作的列值。
有关 Delete 、Insert 、Select 和 Update 触发器的 REFERENCING 子句的语法的描述,请参阅 CREATE TRIGGER 语句中有关 REFERENCING 子句部分。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5684084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存