在 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;