检索列 - %SELECT

可使用此函数来指定有效 SQL SELECT 语句,该 SELECT 语句从辅助表中检索一个或多个列值,以便可将这些列值逻辑地组合到主表记录中。

有关使用 %GETCOL 或 %SELECT 列函数时的性能注意事项的信息,请参阅 CDC Replication Engine for DB2® for z/OS® 文档中的“%GETCOL 和 %SELECT 函数调用及处理效率”一节。在每个 %SELECT 函数中,只能指定一个 SQL SELECT 语句。

要使用此函数,用来启动 CDC Replication 地址空间的 z/OS 用户标识必须具有足够 DB2 for z/OS 特权以执行 SQL SELECT 语句。
注:CDC Replication Engine for DB2 for z/OS 支持此函数。
警告:
对 SQL SELECT 语句的使用可能会在您的环境中构成安全问题。某些子句和函数可能具有不良影响,这些影响会导致对 DB2 表数据的更改和/或在 DB2 的控制之外生成数据。因此,当使用 %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 开始)。

通过在表达式中使用 %VAR 函数,可检索到分配给变量的值,并将这些值映射至主表中的后续列。在以下两种方法中,前者比后者更高效:使用单个 %SELECT 函数来检索所有辅助表列值,然后使用 %VAR 函数来映射至后续列;多次调用 %SELECT 函数来分别检索每个列值。
注: 如果已定义的变量的名称与由 CDC Replication 自动创建的那些变量的名称相同,那么将覆盖先前定义的变量。因此,请确保您已定义的现有变量名称与由 CDC Replication 创建的变量名称不发生冲突。

示例

下列示例使用主表与辅助表之间的关系:

主表 (EMPLOYEE) 与辅助表(COUNTRY、SALES、SALARY
和 VACATION)之间的关系(与 %SELECT 函数配合使用)

%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 函数来检索这些值,并将它们映射至必须添加至该主表的列。

如果 SALARY 没有包含满足 WHERE 子句中条件的记录,那么:
  • %SELECT 函数返回 0。
  • CODE 变量设置为 “Z”
  • LASTADJDATE 变量设置为 1970-01-01。
  • NEXTADJDATE 变量设置为 1901-01-01(z/OS 缺省日期值)。
%SELECT(“SELECT INCOME, LASTADJDATE, CODE, NEXTADJDATE FROM DB1.GSMITH.SALARY WHERE EMP = ? AND BRANCH = ?”, EMPID, EMPBRANCH, 0, 1970-01-01)

在此示例中,仅必须为 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 文档。