南大通用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 权限,然后用户才能执行外部函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值