我需要根据这样的条件在触发器中的 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 作用域意味着变量不能在声明它们的块之外引用。
所以问题是,为什么要在嵌套块中声明此游标?什么时候不直接在扳机体的顶部声明它?