我可以在 Oracle 中触发器的 BEGIN 语句之后声明 CURSOR 吗?



我需要根据这样的条件在触发器中的 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":
开始函数杂注过程子类型类型 当前游标删除
之前存在

如何在 Oracle 中触发器的 BEGIN 语句之后声明游标?

DECLARE 是 PL/SQL 块的开始。块包括一个可选的 DECLARE 部分,后跟一个 BEGIN 部分、一个可选的 EXCEPTION 部分,最后是一个 END。

你在这里有一个嵌套块。Oracle 希望您遵循它,开始和结束。喜欢这个:

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 语句定义的块中使用游标。这是因为 PL/SQL 作用域意味着变量不能在声明它们的块之外引用。

所以问题是,为什么要在嵌套块中声明此游标?什么时候不直接在扳机体的顶部声明它?

最新更新