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

时间:2018-08-17 06:08:46

标签: oracle plsql database-trigger

我需要根据以下条件在触发器中的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语句之后声明游标?

1 个答案:

答案 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范围意味着无法在声明变量的块之外引用变量。

问题是,为什么要在嵌套块中声明此光标?不只是在触发器主体的顶部声明它吗?

相关问题