firebird - 更新行时是否更新游标变量?
问题描述
在下面的代码(存储过程体)中,游标字段的值是否在UPDATE后自动更新?如果不是,关闭/打开命令是否足够?
我没有找到任何包含此内容的描述,它只是所有这些中的 FOR SELECT 游标。
DECLARE VARIABLE FCU_VALIDATE TYPE OF COLUMN FCU_CTRL.FCU_VAL_WHEN_IMP;
DECLARE FCU_DOC_MSTR CURSOR FOR
(SELECT * FROM FCU_DOC_MSTR
WHERE FCU_DOC_APN = :APNUMBER
AND FCU_DOC_ID = :DOCID);
BEGIN
OPEN FCU_DOC_MSTR;
FETCH FIRST FROM FCU_DOC_MSTR;
-- CHECK CONTROL FILE SETTINGS
FCU_VALIDATE = COALESCE((SELECT FCU_VAL_WHEN_IMP FROM FCU_CTRL
WHERE FCU_INDEX1 = 1), FALSE);
IF (FCU_VALIDATE = TRUE) THEN
BEGIN
-- IF EXIST INVALID ITEM DETAIL LINE, SET DOCUMENT STATUS TO INVALID
IF ((SELECT COUNT(*) FROM FCU_ITEM_DET
WHERE FCU_ITEM_APN = :FCU_DOC_MSTR.FCU_DOC_APN
AND FCU_ITEM_DOC_ID = :FCU_DOC_MSTR.FCU_DOC_ID
AND FCU_ITEM_STATUS != '0') > 0) THEN
UPDATE FCU_DOC_MSTR
SET FCU_DOC_STATUS = '90'
WHERE CURRENT OF FCU_DOC_MSTR;
END
-- CHECK DOCUMENT STATUS IS IMPORTED AND NO ERROR EXIST SET STATUS TO IMPORTED
IF (FCU_DOC_MSTR.FCU_DOC_STATUS = '99') THEN
UPDATE FCU_DOC_MSTR
SET FCU_DOC_STATUS = '0'
WHERE CURRENT OF FCU_DOC_MSTR;
IF (FCU_VALIDATE = TRUE) THEN
BEGIN
IF (FCU_DOC_MSTR.FCU_DOC_STATUS = '0') THEN
UPDATE FCU_DOC_MSTR
SET FCU_DOC_STATUS = '1'
WHERE CURRENT OF FCU_DOC_MSTR;
-- UPDATE FILE STATUS
IF ((SELECT COUNT(*) FROM FCU_DOC_MSTR
WHERE FCU_DOC_FILE_ID = :FCU_DOC_MSTR.FCU_DOC_FILE_ID
AND FCU_DOC_STATUS != '1') > 0) THEN
UPDATE FCU_FILE_MSTR
SET FCU_FILE_STATUS = '90'
WHERE FCU_FILE_ID = :FCU_DOC_MSTR.FCU_DOC_FILE_ID;
ELSE
UPDATE FCU_FILE_MSTR
SET FCU_FILE_STATUS = '1'
WHERE FCU_FILE_ID = :FCU_DOC_MSTR.FCU_DOC_FILE_ID;
END
CLOSE FCU_DOC_MSTR;
END
解决方案
如果更新是通过游标完成的(使用UPDATE ... WHERE CURRENT OF _cursor_name_
),那么当前行的游标记录变量也会被更新。
请参阅this fiddle进行演示。
这在 Firebird 3.0 发行说明中没有记录,但它记录在doc/sql.extensions/README.cursor_variables.txt
您的 Firebird 安装随附的文件中。这也记录在 Firebird 3.0 语言参考中,位于FETCH
:
从游标变量中读取会返回当前字段值。这意味着一条
UPDATE
语句(带有WHERE CURRENT OF
子句)不仅会更新表,还会更新游标变量中的字段以供后续读取。执行DELETE
语句(带有WHERE CURRENT OF
子句)会将游标变量中的所有字段设置为 NULL 以供后续读取
推荐阅读
- flutter - 如何在firebase颤动中检索一列的所有行
- go - 拨打tcp
:6379:连接:连接被拒绝 - python - 刮不带标签
- javascript - 如何确保来自可重用函数的数据集在模板中可用
- laravel - 添加了计算列我得到了数组的集合,而不是 ibjects
- tomcat - 根据主机重定向到不同的页面 - Tomcat
- reactjs - 如何将函数传递给 React 的渲染函数
- html - 如何创建响应式表
- android - 在带有警报对话框的回收站视图中滑动删除
- cassandra - Cassandra,通过以下方式获取行:时间戳+间隔
我在 Cassandra 中有一个基于时间表的平台的表格:
CREATE TABLE test ( url text, lasttest timestamp, testintervalminutes int, PRIMARY KEY(url) ) CREATE INDEX test_timeid