获取 UDx 中的参数值
在函数类的处理方法(例如 processBlock()
或 processPartition()
)中,UDx 会使用在其工厂类中声明的参数值(请参阅定义 UDx 接受的参数)。它从 ParamReader
对象(可通过传递到处理方法的 ServerInterface
对象访问此对象)获取参数值。从此对象读取参数类似于从 BlockReader
或 PartitionReader
对象读取参数值:使用该参数名称调用特定于数据类型的函数以检索其值。例如,在 C++ 中:
// Get the parameter reader from the ServerInterface to see if there are supplied parameters.
ParamReader paramReader = srvInterface.getParamReader();
// Get the value of an int parameter named constant.
const vint constant = paramReader.getIntRef("constant");
注意
在字符串数据值传递到函数之前,其任何转义字符均未经过处理。因此,如果函数需要对未转义的字符值执行操作,它可能需要自己处理转义序列。使用工厂类中的参数
除了在 UDx 函数类中使用参数之外,您还可以在工厂类中访问参数。您可能希望访问参数,以让用户通过某种方法控制函数的输入值或输出值。例如,UDx 可以具有一个参数,该参数允许用户选择让 UDx 返回单精度值或双精度值。在工厂类中访问参数的过程与在函数类中访问参数的过程相同:从 ServerInterface
's getParamReader()
方法获取 ParamReader
对象,然后读取参数值。
测试用户是否提供了参数值
与实参处理不同,当用户的函数调用不包含由 UDx 工厂类定义的参数值时,Vertica 不会立即返回错误。这意味着函数可以尝试读取用户未提供的参数值。如果函数进行此尝试,则在默认情况下,Vertica 将向用户返回参数不存在警告,并且包含该函数调用的查询将继续运行。
如果希望参数是可选的,您可以在尝试访问参数的值之前测试用户是否提供了该参数的值。函数通过使用该参数名称调用 ParamReader
的 containsParameter()
方法来确定特定参数的值是否存在。如果此调用返回 true,则函数可以安全地检索值。如果此调用返回 false,则 UDx 可以使用默认值或将其处理更改为某种其他方法以弥补参数值不存在的问题。只要 UDx 不尝试访问不存在的参数值,Vertica 就不会生成有关缺失参数的错误或警告。
注意
如果用户向 UDx 传递未在其中定义的参数,则在默认情况下,Vertica 将发出警告以指明未使用该参数。它仍会执行 SQL 语句,并忽略该参数。可以通过更改StrictUDxParameterChecking
配置参数来更改此行为。
有关示例,请参阅 C++ 示例:定义参数。