调用字段过程时
在三种一般情况下调用为列指定的字段过程。
- 对于 field-definition ,当执行命名过程的 CREATE TABLE 或 ALTER TABLE 语句时。 在此调用期间,该过程应执行以下操作:
- 确定列的数据类型和属性是否有效。
- 验证文字列表,并根据需要对其进行更改。
- 提供列的字段描述。
- 对于字段编码,当要对列值进行编码时。 对下列任何值进行编码:
- 通过 SQL INSERT 语句, SQL MERGE 语句或本机写操作插入到列中。
- 由 SQL UPDATE 语句, SQL MERGE 语句或本机更新操作更改。
- 如果需要复制数据并且目标列具有字段过程,那么可以调用该字段过程来对复制的数据进行编码。 示例包括 SQL 语句 ALTER TABLE 或 CREATE TABLE (带有 LIKE 或 as-result-table 子句) 以及 CL 命令 CPYF 或 RGZPFM。
- 与具有字段过程的列进行比较。 QAQQINI 选项FIELDPROC_ENCODED_比较由优化器用于决定是对列值进行解码,还是对变量,常量或连接列进行编码。
- 如果列具有字段过程,那么在 CREATE 或 ALTER TABLE 时为 DEFAULT 值。
如果存在任何后触发器或读触发器,那么将在其中任何触发器之前调用字段过程。 对于前触发器,可能多次调用带有编码和解码操作的字段过程。 对字段过程的调用次数取决于许多因素,包括触发器类型以及触发器是否更改了触发器缓冲区中的数据。 数据库管理器将确保调用字段过程来对将插入到表中的数据进行编码。
- 对于字段解码,当要将存储的值字段解码回其原始值时。 对于以下任何值都将发生此情况:
- 由 SQL SELECT 或 FETCH 语句或本机读操作检索。
- 如果需要复制数据并且源列具有字段过程,那么有可能在进行复制之前调用该字段过程来对数据进行解码。 示例包括 SQL 语句 ALTER TABLE 或 CREATE TABLE (带有 LIKE 或 as-result-table 子句) 以及 CL 命令 CPYF 或 RGZPFM。
- 与具有字段过程的列进行比较。 QAQQINI 选项FIELDPROC_ENCODED_比较由优化器用于决定是对列值进行解码还是对变量或常量进行编码。
从不调用字段过程来处理空值。 当表没有 DELETE 触发器时,也不会对没有 WHERE 子句的 DELETE 操作调用此函数。 将对空字符串调用字段过程。
建议: 在字段过程中避免编码空白。 当 Db2® for i 比较两个不同长度字符串的值时,它会使用适当的空白字符(例如,EBCDIC 或双字节空白)临时填充较短字符串,直到较长字符串的长度。 如果较短的字符串是具有字段过程的列的值,那么将对编码值进行填充,但不会对填充字符进行编码。 因此,如果过程将空格更改为其他字符,那么较长字符串末尾的编码空格不等于较短字符串末尾的填充空格。 这种情况会导致错误; 例如,某些应该相等的字符串可能不会被识别为错误。 因此,建议不要在字段过程中对空白进行编码。