检索列 - %SELECT
可使用此函数来指定有效 SQL SELECT 语句,该 SELECT 语句从辅助表中检索一个或多个列值,以便可将这些列值逻辑地组合到主表记录中。
有关使用 %GETCOL 或 %SELECT 列函数时的性能注意事项的信息,请参阅 CDC Replication Engine for DB2® for z/OS® 文档中的“%GETCOL 和 %SELECT 函数调用及处理效率”一节。在每个 %SELECT 函数中,只能指定一个 SQL SELECT 语句。
语法
%SELECT(sql_select_stmt, parm1, parm2, ..., parmn, [default_value1],
[default_value2], ...,[default_valuem])
参数
- sql_select_stmt
- 指定包含有效 SQL SELECT 语句的字符串。根据 DB2 for z/OS 使用规则,该语句必须有效。要获取使用规则,请参阅 DB2 for z/OS 文档。必须使用参数占位符来引用直到执行表达式之后才可用的值。要在 SQL SELECT WHERE 子句中标识参数占位符,请使用问号 (?)。
- 在 SQL WHERE 子句中,可使用受 DB2 for z/OS 支持的任何运算符,例如 IN。有关可使用的其他运算符的信息,请参阅 DB2 for z/OS 文档。
- parm1, parm2, ..., parmn
- 指定字面值、列函数、表达式、表达式变量或主表列。在 WHERE 子句中,为 parm1 指定的值会替换第一个问号,为 parm2 指定的值会替换 WHERE 子句中的第二个问号,依此类推。您不能为任何参数占位符指定 NULL。default_value1, default_value2, ...,
- default_value1, default_value2, ..., default_valuem
- 指定当辅助表中不存在由 WHERE 子句指定的记录时该函数为每列返回的缺省值。如果没有为列指定缺省值并且辅助表记录不存在,那么根据该列的数据类型,此函数会返回相应值。例如,零(对于基于数字的列)和零长度字符串(对于基于字符的列),依此类推。要为没有第一个列出在 SQL SELECT 语句中的列指定缺省值,必须为所有前面的列指定缺省值。
- 为此函数指定参数时,请注意下列事项:
- 参数的数目不能超过 21。
- 必须最少指定两个参数。如果仅希望指定 SQL SELECT 语句参数,那么还必须为该函数指定另一参数。有关在哪些情况下必须指定未使用参数,请参阅“示例”部分。
结果数据类型
SQL SELECT 语句中列出的第一个辅助表列的数据类型。
%SELECT 函数的结果是来自 SQL SELECT 语句中指定的第一个列的值。如果 SQL SELECT 语句检索到两个或更多列值,那么会将这些值分配给变量。缺省情况下,这些变量名称与对应列名相同。如果无法定义这些变量名称,那么会将这些名称设置为 COLn,其中 n 是对应列在 SQL SELECT 语句中的数字位置(从 1 开始)。
示例
下列示例使用主表与辅助表之间的关系:
%SELECT(“SELECT COUNTRY FROM DB1.GSMITH.COUNTRY WHERE BRANCH = ?”, EMPBRANCH)采用图中所示的主表和辅助表,可将 %SELECT 函数映射至 EMPLOYEE 表中的 EMPCOUNTRY 列。
对于 EMPLOYEE 主表中的职员,此示例从 COUNTRY 辅助表记录返回其所在国家或地区。如果 COUNTRY 没有包含满足 WHERE 子句中条件的记录,那么此函数会返回针对 COUNTRY 列的数据类型的缺省值。例如,如果该数据类型为字符,那么会返回空白字符。
%SELECT(“SELECT Q1, Q2, Q3, Q4 FROM DB1.GSMITH.SALES WHERE EMP = ? AND ? = 4”, EMPID, EMPBRANCH, 0, 0, 0, 0)采用图中所示的主表和辅助表,可将 %SELECT 函数映射至 EMPLOYEE 表中的 EMPQ1 列。
对于 EMPLOYEE 主表中的职员(其工作地点为分支 4),此示例从 SALES 辅助表记录返回其第一季度的销售数字。
由于此示例返回多个列值,所以 CDC Replication 定义三个变量(名为 Q2、Q3 和 Q4),以分别维护第二、第三和第四季度的销售数字。可使用 %VAR 函数来检索这些值,并将它们映射至 EMPLOYEE 中的 EMPQ2、EMPQ3 和 EMPQ4 列。
如果 SALES 没有包含满足 WHERE 子句中条件的记录,那么该函数会返回 0。此外,CDC Replication 会将这三个变量(Q2、Q3 和 Q4)设置为 0。
%SELECT(“SELECT INCOME, CODE, LASTADJDATE, NEXTADJDATE FROM DB1.GSMITH.SALARY WHERE EMP = ? AND BRANCH = ?”, EMPID, EMPBRANCH, 0, “Z”, 1970-01-01)采用前面图中显示的主表和辅助表,可将 %SELECT 函数映射至 EMPLOYEE 表中的 EMPINCOME 列。
对于 EMPLOYEE 主表中的职员,此示例从 SALARY 辅助表记录返回其收入。
由于此示例返回多个列值,所以 CDC Replication 定义三个变量(名为 CODE、LASTADJDATE 和 NEXTADJDATE),以维护薪水信息的其他项。可使用 %VAR 函数来检索这些值,并将它们映射至必须添加至该主表的列。
- %SELECT 函数返回 0。
- CODE 变量设置为 “Z”。
- LASTADJDATE 变量设置为 1970-01-01。
- NEXTADJDATE 变量设置为 1901-01-01(z/OS 缺省日期值)。
在此示例中,仅必须为 LASTADJDATE 指定缺省值。由于此列在 SQL SELECT 语句中列出为第三个,所以您还必须为 INCOME 和 CODE 列指定缺省值。为了避免需要为 CODE 指定缺省值,请在 SQL SELECT 语句中 CODE 前面引用 LASTADJDATE。
%SELECT(“SELECT USED FROM DB1.GSMITH.VACATION WHERE EMP = ? AND EMPCOUNTRY IN ('USA', 'UK', 'JAPAN', 'FRANCE')”, EMPID, 0)采用前面图中显示的主表和辅助表,可将 %SELECT 函数映射至 EMPLOYEE 表中的 EMPVACUSED 列。
对于 EMPLOYEE 主表(位于美国、英国、日本或法国)中的职员,此示例从 VACATION 辅助表记录返回已用假期量。如果 VACATION 没有包含满足 WHERE 子句中条件的记录,那么 %SELECT 函数返回 0。
%SELECT(“SELECT NEXT VALUE FOR SEQ1 FROM SYSIBM.SYSDUMMY1”, 1)此示例返回序列 SEQ1 的下一个值。在此情况下,结果的数据类型与序列对象的数据类型相同。此示例使用 %SELECT 函数在 DB2 for z/OS V8 或更高版本中检索某个序列的下一个值。SYSDUMMY1 是为了满足语法要求而在 SQL SELECT 语句中引用的现有 DB2 哑元系统表。
必须为第二个参数输入任何整数值,以便调用该函数。例如,1。
有关序列以及可从序列生成的值的类型的信息,请参阅 DB2 for z/OS 文档。
%SELECT(“SELECT PREVIOUS VALUE FOR SEQ2 FROM SYSIBM.SYSDUMMY1”, 24)此示例返回序列 SEQ2 的上一个值。在此情况下,结果的数据类型与序列对象的数据类型相同。
此示例使用 %SELECT 函数在 DB2 for z/OS V8 或更高版本中检索某个序列的前一个值。SYSDUMMY1 是为了满足语法要求而在 SQL SELECT 语句中引用的现有 DB2 哑元系统表。
必须为第二个参数输入任何整数值,以便调用该函数。例如,24。
有关序列以及可从序列生成的值的类型的信息,请参阅 DB2 for z/OS 文档。