获取 UDx 中的参数值

在函数类的处理方法(例如 processBlock()processPartition())中,UDx 会使用在其工厂类中声明的参数值(请参阅定义 UDx 接受的参数)。它从 ParamReader 对象(可通过传递到处理方法的 ServerInterface 对象访问此对象)获取参数值。从此对象读取参数类似于从 BlockReaderPartitionReader 对象读取参数值:使用该参数名称调用特定于数据类型的函数以检索其值。例如,在 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 将向用户返回参数不存在警告,并且包含该函数调用的查询将继续运行。

如果希望参数是可选的,您可以在尝试访问参数的值之前测试用户是否提供了该参数的值。函数通过使用该参数名称调用 ParamReadercontainsParameter() 方法来确定特定参数的值是否存在。如果此调用返回 true,则函数可以安全地检索值。如果此调用返回 false,则 UDx 可以使用默认值或将其处理更改为某种其他方法以弥补参数值不存在的问题。只要 UDx 不尝试访问不存在的参数值,Vertica 就不会生成有关缺失参数的错误或警告。

有关示例,请参阅 C++ 示例:定义参数