指定传递未注册参数的行为

默认情况下,Vertica 会在您向 UDx 传递未注册参数时发出警告消息。未注册参数是指未在 getParameterType() 方法中声明的参数。

可以通过更改 StrictUDxParameterChecking 配置参数来控制 UDx 在您向其传递未注册参数时的行为。

未注册参数行为设置

可以指定 UDx 为响应一个或多个未注册参数而做出的行为。要执行此操作,请将 StrictUDxParameterChecking 配置参数设置为以下值之一:

  • 0:允许 UDx 访问未注册参数。ParamReader 类的 getType() 方法决定未注册参数的数据类型。Vertica 不会显示任何警告或错误消息。

  • 1(默认值):忽略未注册参数并允许函数运行。Vertica 将显示警告消息。

  • 2:返回错误并阻止函数运行。

示例

以下示例演示了可以通过对 StrictUDxParameterChecking 参数使用不同的值来指定的行为。

查看 StrictUDxParameterChecking 的当前值

要查看 StrictUDxParameterChecking 配置参数的当前值,请运行以下查询:


=> \x
Expanded display is on.
=> SELECT * FROM configuration_parameters WHERE parameter_name = 'StrictUDxParameterChecking';
-[ RECORD 1 ]-----------------+------------------------------------------------------------------
node_name                     | ALL
parameter_name                | StrictUDxParameterChecking
current_value                 | 1
restart_value                 | 1
database_value                | 1
default_value                 | 1
current_level                 | DATABASE
restart_level                 | DATABASE
is_mismatch                   | f
groups                        |
allowed_levels                | DATABASE
superuser_only                | f
change_under_support_guidance | f
change_requires_restart       | f
description                   | Sets the behavior to deal with undeclared UDx function parameters

更改 StrictUDxParameterChecking 的值

可以在数据库级别、节点级别或会话级别更改 StrictUDxParameterChecking 配置参数的值。例如,可以将值更改为“0”,以指定可以向 UDx 传递未注册参数而不显示警告或错误消息:


=> ALTER DATABASE DEFAULT SET StrictUDxParameterChecking = 0;
ALTER DATABASE

RemoveSymbol 的无效参数行为

以下示例演示了如何调用 RemoveSymbol UDSF 示例。RemoveSymbol UDSF 具有一个必需参数 (symbol) 和一个可选参数 (n)。在此示例中,未使用可选参数。

如果同时传递 symbol 和一个名为 wrongParam 的附加参数(未在 UDx 中声明此参数),UDx 的行为会根据 StrictUDxParameterChecking 的值相应地更改。

如果将 StrictUDxParameterChecking 设置为“0”,UDx 将正常运行而不显示警告。此外,wrongParam 将变为可供 UDx 访问(通过 ServerInterface 对象的 ParamReader 对象):


=> ALTER DATABASE DEFAULT SET StrictUDxParameterChecking = 0;
ALTER DATABASE

=> SELECT '3re3mo3ve3sy3mb3ol' original_string, RemoveSymbol('3re3mo3ve3sy3mb3ol' USING PARAMETERS symbol='3', wrongParam='x');
  original_string   |   RemoveSymbol
--------------------+-------------------
 3re3mo3ve3sy3mb3ol | re3mo3ve3sy3mb3ol
(1 row)

如果将 StrictUDxParameterChecking 设置为“1”,UDx 将忽略 wrongParam 并正常运行。但是,它还会发出警告消息:


=> ALTER DATABASE DEFAULT SET StrictUDxParameterChecking = 1;
ALTER DATABASE

=> SELECT '3re3mo3ve3sy3mb3ol' original_string, RemoveSymbol('3re3mo3ve3sy3mb3ol' USING PARAMETERS symbol='3', wrongParam='x');
WARNING 4320:  Parameter wrongParam was not registered by the function and cannot be coerced to a definite data type
  original_string   |   RemoveSymbol
--------------------+-------------------
 3re3mo3ve3sy3mb3ol | re3mo3ve3sy3mb3ol
(1 row)

如果将 StrictUDxParameterChecking 设置为 '2',UDx 将在尝试调用 wrongParam 时遇到错误并且无法运行。相反,它会生成错误消息:


=> ALTER DATABASE DEFAULT SET StrictUDxParameterChecking = 2;
ALTER DATABASE

=> SELECT '3re3mo3ve3sy3mb3ol' original_string, RemoveSymbol('3re3mo3ve3sy3mb3ol' USING PARAMETERS symbol='3', wrongParam='x');
ERROR 0:  Parameter wrongParam was not registered by the function