在 SPL 例程中声明动态游标

在 SPL 例程中使用 DECLARE 语句声明动态游标的名称,并将此游标与 PREPARE 语句在同一 SPL 例程中声明的准备好的语句的语句标识符相关联。

SQL 的 DECLARE 语句在 SPL 例程中创建的动态游标与 SPL 的 FOREACH 语句在 SPL 例程中创建的直接顺序游标不同。(有关顺序游标的语法和用法,请参阅 FOREACH。)

语法

SPL 例程中 DECLARE 语句是 GBase 8s ESQL/C 例程中 DECLARE 支持的语法的子集。

元素 描述 限制 语法
cursor_id 此处为动态游标声明的名称r 在例程的游标名称、准备好的语句名称和 SPL 变量名称中必须是唯一 标识符
statement_id 一个准备好的 SQL 语句的标识符 必须已在同一 SPL 例程的 PREPARE 语句中声明 标识符

用法

在以 SPL 语言编写的 UDR 中,与游标相关联的 statement_id 必须已在 PREPARE 语句的同一 UDR 中从这些语句类型之一的单个 SQL 语句的文本中预先声明:
  • EXECUTE FUNCTION
  • EXECUTE PROCEDURE
  • SELECT.

statement_id 指定的准备好的语句文本可以包含问号( ? )作为用户在运行时提供的值的占位符,但 PREPARE 语句中的占位符只能表示数据值,而不能表示 SQL 标识符。

DECLARE 语句可以在 SPL 例程中定义的动态游标类似于 ESQL/C 在其功能中 Select 游标或函数游标,但是具有以下限制:
  • DECLARE 在 SPL 例程中定义的游标可以是 Select 游标或函数游标,但是它们不能是 Insert 游标或集合游标。
  • 游标或准备好的语句的标识符不能指定为 SPL 变量。因为在 SPL 中,变量、游标和准备好对象的标识符会共享同一命名空间。
  • 缺省情况下,SPL 的动态游标是顺序的。它们不能是滚动游标。
  • 您使用 WITH HOLD 关键字创建的动态游标的语义与 FOREACH 语句声明的保持游标相同。
  • SPL 例程中的 WITH HOLD 关键字只对 Select 游标有效。如果 statement_id 引用了 EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句的准备好的文本,则 DECLARE 语句失败并发出错误 -26056。
  • 在 DECLARE 语句中 ESQL/C 支持的 FOR UPDATE 和 FOR READ ONLY 关键字在 SPL 例程中不支持。使用 SPL 的 FOREACH 语句声明可以模拟 ESQL/C 更新游标的功能的直接游标。(但是当编译 UDR 时,而不是在运行时定义与直接游标相关联的查询。)
  • SPL 例程中的 DECLARE 语句在集合派生的表上不支持 SELECT 操作。
  • SPL 例程的 DECLARE 语句中的语法错误会在运行时报告,不像 ESQL/C 的语法错误,在例程编译完后报告。

DECLARE 的语句与 SPL 例程中的准备好的语句相关联的动态游标的名称可以由同一 SPL 例程中的动态 SQL 的 OPEN 、CLOSE 、FETCH 和 FREE 语句引用。

在以下程序片段中,声明一个名为 equi_noctis 的游标,并打开、关闭和释放它。
CREATE FUNCTION lente
          DEFINE first, last VARCHAR(30);
          . . .
          DATABASE stores_demo;
          LET first = "select * from state";
          LET lsst = "where code < ?";
          PREPARE stmt_1 FROM first || last;
          DECLARE cursor_1 FOR stmt_1;
          OPEN cursor_1
          . . .
          CLOSE cursor_1;
          FREE cursor_1;
          FREE stmt_1;
          ...
          END FUNCTION;
1 GBase 8s 扩展