用户定义的会话参数
使用用户定义的会话参数,可以编写比 Vertica 提供的参数更通用的参数。您可以使用以下方法配置用户定义的会话参数:
-
从客户端 — 例如,使用
ALTER SESSION
-
通过 UDx 自身
用户定义的会话参数可以传递到受 Vertica 支持的任何类型的 UDx。您还可以在会话级别为您的 UDx 设置参数。通过指定用户定义的会话参数,您可以持续保存参数状态。甚至当 UDx 在单个会话期间被多次调用时,Vertica 也可以保存参数状态。
RowCount 示例使用用户定义的会话参数。此参数会计算出每次运行时 UDx 处理的行的总数。然后,RowCount 会显示所有执行操作处理的行的总数。有关如何实施,请参阅 C++ 示例:使用会话参数和 Java 示例:使用会话参数。
查看用户定义的会话参数
输入以下命令以查看所有会话参数的值:
=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+---------+-----+-------
(0 rows)
尚未设置任何值,因此该表为空。现在执行 UDx:
=> SELECT RowCount(5,5);
RowCount
----------
10
(1 row)
再次输入命令,查看会话参数的值:
=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+-----------+----------+-------
public | UDSession | rowcount | 1
(1 row)
库列显示包含 UDx 的库的名称。这是使用 CREATE LIBRARY 设置的名称。因为 UDx 已经处理了一行,所以 rowcount 会话参数的值当前为 1。再运行两次 Udx 应将该值增加 2。
=> SELECT RowCount(10,10);
RowCount
----------
20
(1 row)
=> SELECT RowCount(15,15);
RowCount
----------
30
(1 row)
现在您已经执行了三次 UDx,获取了 5 + 5、10 + 10 和 15 + 15 的总和。现在,检查 rowcount 的值。
=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+-----------+----------+-------
public | UDSession | rowcount | 3
(1 row)
更改用户定义的会话参数
您还可以手动更改 rowcount 的值。为此,请输入以下命令:
=> ALTER SESSION SET UDPARAMETER FOR UDSession rowcount = 25;
ALTER SESSION
检查 RowCount 的值:
=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+-----------+----------+-------
public | UDSession | rowcount | 25
(1 row)
清除用户定义的会话参数
从客户端:
要清除 rowcount 的当前值,请输入以下命令:
=> ALTER SESSION CLEAR UDPARAMETER FOR UDSession rowcount;
ALTER SESSION
确认 rowcount 已被清除:
=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+---------+-----+-------
(0 rows)
通过 C++ UDx:
可以将会话参数通过 UDx 自身进行清除。例如,要在其值达到 10 或更大值时清除 rowcount,请执行下列操作:
-
从 RowCount 类的
destroy()
方法中移除以下行:udParams.getUDSessionParamWriter("library").getStringRef("rowCount").copy(i_as_string);
-
将已从
destroy()
方法中移除的行替换为以下代码:if (rowCount < 10) { udParams.getUDSessionParamWriter("library").getStringRef("rowCount").copy(i_as_string); } else { udParams.getUDSessionParamWriter("library").clearParameter("rowCount"); }
-
要查看 Udx 是否已清除会话参数,请将 rowcount 的值设置为 9:
=> ALTER SESSION SET UDPARAMETER FOR UDSession rowcount = 9; ALTER SESSION
-
检查 rowcount 的值:
=> SHOW SESSION UDPARAMETER all; schema | library | key | value --------+-----------+----------+------- public | UDSession | rowcount | 9 (1 row)
-
调用 RowCount,使它的值变成 10:
=> SELECT RowCount(15,15); RowCount ---------- 30 (1 row)
-
再次检查 rowcount 的值。由于值已达到 10(即 UDx 中指定的阈值),因此可认为 rowcount 已被清除:
=> SHOW SESSION UDPARAMETER all; schema | library | key | value --------+---------+-----+------- (0 rows)
正如预计的那样,RowCount 已被清除。
通过 Java UDx:
-
从 RowCount 类的
destroy()
方法中移除以下行:udParams.getUDSessionParamWriter("library").setString("rowCount", Integer.toString(rowCount)); srvInterface.log("RowNumber processed %d records", count);
-
将已从
destroy()
方法中移除的行替换为以下代码:if (rowCount < 10) { udParams.getUDSessionParamWriter("library").setString("rowCount", Integer.toString(rowCount)); srvInterface.log("RowNumber processed %d records", count); } else { udParams.getUDSessionParamWriter("library").clearParameter("rowCount"); }
-
要查看 Udx 是否已清除会话参数,请将 rowcount 的值设置为 9:
=> ALTER SESSION SET UDPARAMETER FOR UDSession rowcount = 9; ALTER SESSION
-
检查 rowcount 的值:
=> SHOW SESSION UDPARAMETER all; schema | library | key | value --------+-----------+----------+------- public | UDSession | rowcount | 9 (1 row)
-
调用 RowCount,使它的值变成 10:
=> SELECT RowCount(15,15); RowCount ---------- 30 (1 row)
-
检查 rowcount 的值。由于值已达到 10(即 UDx 中指定的阈值),因此可认为 rowcount 已被清除:
=> SHOW SESSION UDPARAMETER all; schema | library | key | value --------+---------+-----+------- (0 rows)
正如预计的那样,rowcount 已被清除。
只读会话参数和隐藏的会话参数
如果不想在 UDx 之外的其他地方设置参数,您可以将其设为只读。此外,如果不想让参数在客户端内可见,您可以将其设为隐藏。
将参数变为只读,就意味着它不能在客户端中设置,但是可以进行查看。要将参数变为只读,请在参数名称前面添加单下划线。例如,要将 rowCount 变为只读,请将 UDx 中的所有“rowCount”实例更改为“_rowCount”。
将参数设为隐藏,就意味着它不能在客户端中查看,也不能设置。要将参数设为隐藏,请在参数名称前面添加两个下划线。例如,要将 rowCount 变为隐藏,请将 UDx 中的所有“rowCount”实例更改为“__rowCount”。