我需要根据以下条件在触发器中的BEGIN语句之后创建CURSOR:
IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN
DECLARE CURSOR cur_list IS
SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWF_ID = :NEW.DWF_ID;
END IF;
编译时出现此错误:
错误(99,5):PLS-00103:在预期以下情况之一时遇到了符号“ END”:
begin函数编译指示过程子类型类型
当前光标删除已存在
如何在Oracle的触发器的BEGIN语句之后声明游标?
答案 0 :(得分:6)
DECLARE是PL / SQL块的开始。一个块包括一个可选的DECLARE节,其后是一个BEGIN节,一个可选的EXCEPTION节,最后是一个END。
这里有一个嵌套块。 Oracle希望您以BEGIN和END开头。像这样:
IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN
DECLARE CURSOR cur_list IS
SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWF_ID = :NEW.DWF_ID;
begin
-- some code here
end;
END IF;
也就是说,您必须在DECLARE语句定义的块中编写代码以使用Cursor。这是因为PL / SQL范围意味着无法在声明变量的块之外引用变量。
问题是,为什么要在嵌套块中声明此光标?不只是在触发器主体的顶部声明它吗?