ALTER FUNCTION

使用 ALTER FUNCTION 命令更改函数对象文件、返回值、内存使用选项或日志记录级别。 您还可以使用此命令更改 UDF 的所有者。

使用此命令不能更改函数名称或参数类型列表。 要更改函数名称、参数类型列表或两者,必须放弃该函数,然后用新名称、参数类型列表或两者创建一个函数。

概要

ALTER FUNCTION 命令的语法如下:
ALTER FUNCTION function_name(argument_types)
[RETURNS return_type] [FENCED | NOT FENCED]
[DETERMINISTIC | NOT DETERMINISTIC]
[RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT]
[MAXIMUM MEMORY mem]
[LOGMASK mask] [NO DEPENDENCIES| DEPENDENCIES deplibs]
[API VERSION [ 1 | 2 ] ]
[NO ENVIRONMENT | ENVIRONMENT 'name' = 'value' , 'name2' = 'value2']
[TABLE, TABLE FINAL ALLOWED | TABLE ALLOWED | TABLE FINAL ALLOWED]
[PARALLEL ALLOWED | PARALLEL NOT ALLOWED]
[EXTERNAL CLASS NAME 'class_name']
[EXTERNAL HOST OBJECT 'host_object_filename']
[EXTERNAL SPU OBJECT 'SPU_object_filename']
ALTER FUNCTION function_name(argument_types) OWNER TO name 

输入

ALTER FUNCTION 命令接受以下输入:
表 1. ALTER FUNCTION 输入
输入 描述
FUNCTION_NAME 指定要更改的功能名称。 不能更改函数名称。 功能必须在当前数据库中。

对于支持多模式的系统,可以指定schema.function格式的名称,以便在当前数据库的不同模式中更改 UDF。 不能更改不同数据库中的功能。

参数类型 完全指定的参数和类型列表,用于唯一标识函数。 您还可以指定 VARARGS 值来创建一个变量参数集合,用户最多可以输入 64 个任何支持数据类型的值。 VARARGS 是一个互斥值,不能在列表中指定任何其他参数。

不能更改参数列表或大小。 您可以从参数列表中移除 VARARGS,或将其添加到本来为空的参数列表中。 使用此命令不能更改参数列表。

支持所有Netezza Performance Server数据类型。 字符串必须包含尺寸或 ANY(通用尺寸)。 NUMERIC 类型必须包含精度和刻度,对于通用尺寸则必须包含 ANY。

返回 返回类型 return_type 值是一个完全指定的参数和类型。 它遵循与 argument_types 相同的规则。 如果 API 版本为 2,返回类型也可以是 TABLE(name type,name2 type2, ...) 或 TABLE(ANY) 指定表格函数。
FENCED

NOT FENCED

指定函数是否在受保护地址空间(栅栏模式)的单独进程中执行。 要创建取消围栏功能,您必须拥有取消围栏管理权限。
[确定性 | 非确定性] DETERMINISTIC 表示 UDF 是一个纯函数,在参数值相同的情况下总是返回相同的值,并且没有副作用。 系统可能会将参数列表完全相同的确定性 UDF 的多个实例视为共同子表达式消除(CSE)的候选实例。
如果函数是确定的,则在语句准备时调用一次,而不是每行调用一次,条件是以下任一条件为真:
  • 如果输入为空,且一个或多个参数为空(字面 NULL),则返回空。
  • 它有所有不变的论点。

如果参数是 SQL 字面量,或者是在语句准备时评估一次而不是每行评估一次的 UDF 或内置函数的结果,那么该参数就是常量。 有关此设置的查询优化效果的更多信息,请参阅Netezza Performance Server查询优化和 UDX 调用

[空输入时返回空值 | 空输入时调用空值] RETURNS NULL ON NULL INPUT 表示当函数的任何参数为 NULL 时,函数总是返回 NULL。 如果指定了该参数,当参数为 NULL 时,函数不会被执行,而是自动假定结果为 NULL。

CALLED ON NULL INPUT(默认值)表示当函数的某些参数为 NULL 时,函数被正常调用。 然后,函数创建者有责任在必要时检查 NULL 值,并做出适当的响应。 有关此设置的查询优化效果的更多信息,请参阅Netezza Performance Server查询优化和 UDX 调用

最大内存 指定函数的潜在内存使用指示。 大小值可以是空值,也可以是由数字和字母 b(字节)、k(千字节)、m(兆字节)或 g(千兆字节)组成的值。 例如,有效值可以是 "0"、1k"、100k"、1g"或10m"。 缺省值为 0。
LOGMASK屏蔽 指定功能的日志控制级别。 有效值为 "无"、"DEBUG "和 "TRACE",或以逗号分隔的 DEBUG 和 TRACE 组合。
依赖项deplibs 指定 UDX 的用户自定义共享库依赖关系的可选列表。 您可以指定一个库名或以逗号分隔的库名列表。
无依赖性 指定 UDX 没有依赖关系,如果省略 DEPENDENCIESdeplibs,则默认为没有依赖关系。 您可以使用该选项清除 UDX 先前声明的任何依赖关系。
应用程序版本 [1 | 2] 指定聚合体使用的 UDX 接口版本。 API 版本必须与主机和 SPU 对象文件的编译版本一致。 缺省值为 1。 如果包含版本 2 的编译对象,则必须指定 API VERSION 2。
环境 指定函数执行时可用的名-值对。 您可以指定多个以逗号分隔的名-值对。
无环境 要变更一个或多个环境对的现有集合,必须指定所有环境设置;ALTER 命令会将当前列表替换为 ALTER 命令中指定的列表。 要清除环境列表,请指定 NO ENVIRONMENT(无环境)。
表格,表格最终允许

允许表格

表格最后允许

指定控制如何调用用户定义表函数的选项。
  • TABLE, TABLE FINAL ALLOWED 选项指定可以通过使用 TABLE(func())、TABLE WITH FINAL(func())或两种情况调用表函数。
  • 您还可以指定 TABLE ALLOWED 或 TABLE FINAL ALLOWED,以允许使用其中一种表格调用用户定义的表格函数。

FINAL 表示在处理完所有输入行后才调用表格函数,因此可以输出更多行。

允许并行 指定用户定义的表函数可以在主机或 SPU 上调用,由优化器自行决定。
不允许并行 指定表格函数始终在主机上调用,或由优化器自行决定在一个选定的 SPU 上调用。
外部类名"class_name 指定实现函数的 C++ 类的名称。 该类必须派生自 Udf 基类,并且必须实现一个静态方法来实例化该类的一个实例。
外部主机对象"host_object_filename 指定主机执行编译对象的路径名。
外部 SPU对象 "SPU_object_filename 指定Linux®SPU 编译对象文件的路径名。 为 "IBM® Netezza® 100和 "Netezza 1000型号上的 "Rev10SPU 指定 "spu10编译对象。

输出

ALTER FUNCTION 命令有以下输出:
表 2. ALTER FUNCTION 输出
输出 描述
ALTER FUNCTION 命令成功后返回的信息。
Error: AlterFunction: existing UDX name(argument_types) differs in size of string/numeric arguments 此错误表示存在名称相同的 UDX,但字符串或数字参数的指定尺寸不同。 要更改函数,请确保您指定的参数类型列表大小正确。
ERROR: lookupLibrary: library libname does not exist 如果系统无法找到指定为依赖关系的用户定义共享库,系统将返回的信息。
ERROR: Version mismatch for function udx_name. Specified version 2, but provided version 1 object file 编译后的对象文件使用第 1 版 API 支持,但 SQL 命令使用第 2 版功能。 您必须创建版本 2 的编译对象,或者删除 ALTER 命令中指定版本 2 功能的选项。
ERROR: Version mismatch for function udx_name. Specified version 1, but provided version 2 object file 编译后的对象文件使用第 2 版 API 支持,但 SQL 命令使用第 1 版功能。 您必须指定版本 1 的编译对象,或更改 ALTER 命令以指定版本 2 的语法。
ERROR: Environment names can't be empty 环境设置的名称值不能为空字符串。
ERROR: type 'type' is not yet defined 指定的返回类型不是已知的Netezza Performance Server数据类型。

描述

不能更改活动查询中正在使用的用户定义函数。 活动查询事务完成后,Netezza Performance Server系统会处理 ALTER FUNCTION 命令以更新函数。

需要权限

要更改 UDF,必须满足以下条件之一:
  • 您必须拥有 FUNCTION 对象的更改权限。
  • 您必须拥有特定 UDF 对象的更改权限。
  • 您必须拥有 UDF。
  • 您必须是数据库管理员用户,拥有当前数据库,或在支持多模式的系统中拥有当前模式。
  • 要更改要取消围栏的功能,必须拥有取消围栏管理权限。
注意:发出 ALTER FUNCTION 命令并指定新对象文件时,数据库会以用户 nz 的身份处理 HOST OBJECT 和 SPU OBJECT 文件。 用户 nz 必须拥有对对象文件的读取权限,以及对从根目录到对象文件的路径中每个目录的读取和执行权限。

常用任务

您可以使用 ALTER FUNCTION 命令来更改函数的所有者。 确保指定函数的完整签名(名称和参数类型列表)如下:
ALTER FUNCTION function_name(argument_types) OWNER TO name

用途

以下是使用示例。
  • 要修改名为 "myfunc(char(12))的示例函数,将最大内存(MAXIMUM MEMORY)选项设置为100k请输入
    MYDB.SCHEMA(MYUSER)=> ALTER FUNCTION myfunc(char(12)) MAXIMUM MEMORY
    '100k';