【问题标题】:Can I declare a CURSOR after BEGIN statement of trigger in Oracle?我可以在 Oracle 中触发器的 BEGIN 语句之后声明一个 CURSOR 吗?
【发布时间】:2019-01-24 03:18:50
【问题描述】:

我需要在触发器中基于这样的条件在 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”:
开始函数 pragma 过程子类型类型
当前光标删除之前存在

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

【问题讨论】:

    标签: oracle plsql database-trigger


    【解决方案1】:

    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 范围意味着不能在声明它们的块之外引用变量。

    所以问题是,为什么要在嵌套块中声明这个游标?什么时候不只是在触发器主体的顶部声明它?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 2010-11-10
      • 2021-06-23
      相关资源
      最近更新 更多