代码之家  ›  专栏  ›  技术社区  ›  eaolson

我可以对交互式网格行删除进行验证吗?

  •  1
  • eaolson  · 技术社区  · 7 年前

    我试图在交互式网格上添加验证,基本上是为了检查是否有任何内容依赖于该行,因此我可以显示一个用户友好的错误,而不是“Ajax调用返回的服务器错误ora-20987:apex-ora-02292:完整性约束(foo.my_约束)…”,但验证总是似乎跳过了已删除的行。我做错什么了吗?我用的是Apex 5.1.2。

    为了测试,我在交互网格上创建了一个验证,type=no rows returned,sql query=select 1 from dual-where:apex$row_status='d'。我希望这样可以防止删除任何行。相反,总是跳过验证。调试日志如下:

    Perform custom validations:
    ...Validation "New" - Type: NOT_EXISTS
    ......Skip for row 1 because "Row Status" is "Deleted"
    

    我尝试更改验证的类型,将Always Execute设置为Yes,使用的范围可以是所有提交的行、创建和修改的行,但没有运气。

    我在这里创建了一个演示: https://apex.oracle.com/pls/apex/f?p=62159:10

    2 回复  |  直到 6 年前
        1
  •  1
  •   Tony Andrews    7 年前

    使用apex错误处理函数的 apex error handling function可以获得更好的约束冲突消息。这将截获错误消息,并允许您使用它做任何您想做的事情,例如查找特定的约束名称和输出一个更合适(干净)的消息,如下所示:

    另外,您可以用如下的pl/sql代码替换默认的网格处理:

    开始 案例:apex$row_状态 当“c”时 插入EMP(EMPNO、ENAME、DEPTNO) 值(:empno,:ename,:deptno) 将rowid返回到:rowid; 当“u”时 更新EMP 设置名称=:名称, DEPTNO=:DEPTNO 其中rowid=:rowid; “D”什么时候? 删除EMP 其中rowid=:rowid; 结束案例; 结束;

    您可以调用自己的API,而不是简单的DML语句,例如

    当“d”时,然后 emp_pkg.delete_emp(:rowid);

    然后,它们可以在执行DML之前实现您自己的业务规则和错误消息。直到需要使用错误处理函数从异常消息中删除“ora-20001:”和类似的内容为止。

    .这将截获错误消息,并允许您使用它做任何您想做的事情,例如查找特定的约束名称和输出一个更合适(干净)的消息,如下所示: enter image description here

    另外,您可以用如下的pl/sql代码替换默认的网格处理:

    begin  
         case :APEX$ROW_STATUS  
         when 'C' then
             insert into emp ( empno, ename, deptno )  
             values ( :EMPNO, :ENAME, :DEPTNO )  
             returning rowid into :ROWID;  
         when 'U' then  
             update emp  
                set ename  = :ENAME,  
                    deptno = :DEPTNO  
              where rowid  = :ROWID;  
         when 'D' then  
             delete emp  
             where rowid = :ROWID;  
         end case;  
    end;  
    

    您可以调用自己的API,而不是简单的DML语句。

         when 'D' then  
             emp_pkg.delete_emp (:ROWID);  
    

    然后,它们可以在执行DML之前实现您自己的业务规则和错误消息。直到需要错误处理函数才能从异常消息中删除“ora-20001:”等。

        2
  •  0
  •   eaolson    6 年前

    帕特里克·沃尔夫已经确认这是一个漏洞,将被修复。 https://community.oracle.com/message/14862207#14862207