固定列表SELECT语句返回包含已知数量已知类型值的行。 当您使用这种类型的语句时,您事先就知道需要声明哪些类型的宿主变量来存储结果。
关于本任务
固定列表
一词并不意味着您必须事先知道将返回多少行数据。 但是,您必须知道列的数量和这些列的数据类型。 固定列表 SELECT 语句返回的结果表可以包含任意数量的行;您的程序使用 FETCH 语句逐行查看这些行。 每次连续取值返回的值个数与上次相同,且每次返回的值具有相同的数据类型。 因此,您可以像处理静态 SQL 一样指定宿主变量。
固定列表选择(SELECT)的一个优点是,您可以使用 Db2 支持的任何编程语言编写它。 变长列表动态SELECT语句需要汇编语言、C语言、 PL/I 和 COBOL。
例如,假设您的程序通过动态执行以下形式的 SELECT 语句来检索姓氏和电话号码:
SELECT LASTNAME, PHONENO FROM DSN8C10.EMP
WHERE ... ;
程序从终端读取语句,用户确定WHERE子句。
与非 SELECT 语句一样,您的程序将语句放入一个长度可变的字符变量中,将其命名为 DSTRING。 最终,您会准备一个 DSTRING 语句,但首先必须为语句声明一个光标并为其命名。
过程
要动态执行固定列表SELECT语句,您的程序必须:
- 包括一个SQLCA。
- 将输入的SQL语句加载到数据区。
前两个步骤完全相同,包括在程序中使用动态 SQL 处理非 SELECT 语句。
- 声明语句名称的游标。
动态 SELECT 语句不能使用 INTO。 因此,您必须使用光标将结果放入宿主变量中。
例如,当您声明游标时,使用语句名称(将其命名为STMT),并给游标本身起一个名字(例如 C1 ):
EXEC SQL DECLARE C1 CURSOR FOR STMT;
- 准备发言。
从DSTRING中准备语句(STMT)。 以下是PREPARE语句的一个示例:
EXEC SQL PREPARE STMT FROM :DSTRING ATTRIBUTES :ATTRVAR;
ATTRVAR包含您想要添加到SELECT语句中的属性,例如FETCH FIRST 10 ROWS ONLY或OPTIMIZE for 1 ROW。 通常,如果SELECT语句中的属性与PREPARE语句中的属性冲突,则SELECT语句中的属性优先于PREPARE语句中的属性。 然而,在这个示例中,DSTRING中的SELECT语句没有指定任何属性,因此 Db2 使用ATTRVAR中的属性来执行SELECT语句。
与非SELECT语句一样,固定列表SELECT可以包含参数标记。 然而,这个例子不需要它们。
- 打开光标。
OPEN语句评估名为STMT的SELECT语句。
例如,如果没有参数标记,请使用以下语句:
EXEC SQL OPEN C1;
如果STMT包含参数标记,则必须使用OPEN的USING子句为STMT中的所有参数标记提供值。 如果STMT中有四个参数标记,则需要以下语句:
EXEC SQL OPEN C1 USING :PARM1, :PARM2, :PARM3, :PARM4;
- 从结果表中获取行。
例如,您的程序可能会反复执行如下语句:
EXEC SQL FETCH C1 INTO :NAME, :PHONE;
该语句的关键特征是使用一个宿主变量列表来接收 FETCH 返回的值。 列表中已知的数据类型项(此处为两个项::NAME和:PHONE)的数量已知(均为字符串,长度分别为15和4)。
您之所以能在FETCH语句中使用此列表,是因为您计划只使用固定列表SELECT。 光标 C1 指向的每一行都必须包含两个长度合适的字符值。 如果程序要处理其他内容,则必须使用将动态 SQL 包含在程序中的技术,以便在程序中使用可变列表 SELECT 语句。
- 关闭光标。
这一步与静态SQL相同。
程序中的“WHENEVER NOT FOUND”语句可以指代包含该语句的常规:
EXEC SQL CLOSE C1;
- 处理任何由此产生的错误。 这一步与静态SQL相同,只是可能产生的错误数量和类型不同。