在更新行时是否更新游标变量?



在下面的代码(存储过程体)中,光标字段的值是否在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_),那么当前行的游标记录变量也会被更新。

请看下面的演示。

这在Firebird 3.0发行说明中没有记录,但是在您的Firebird安装中包含的doc/sql.extensions/README.cursor_variables.txt中有记录。这在Firebird 3.0语言参考中也有记录,在FETCH:

从游标变量读取返回当前字段值。这表示UPDATE语句(带有WHERE CURRENT OF子句)不仅要更新表,还要更新游标中的字段变量用于后续读取。执行DELETE语句(带WHERE CURRENT OF子句)将设置游标变量中的所有字段为NULL

最新更新