WHEN_VALIDATE触发器中的GO_BLOCK

Nac*_*321 4 sql oracle plsql oracleforms

我正在使用oracle表单.每当修改特定字段的值时,我都必须运行一个过程.我必须执行的过程包含一个go_block指令,该指令不能在when_validate_item触发器中使用.反正有没有绕过这个?

编辑

我必须使用when_validate_item,因为必须在修改字段时运行我必须运行的过程,但是在执行验证之前.

Ann*_*awn 12

通常有使用上的限制GO_BLOCKGO_ITEMWHEN-VALIDATE-ITEM.然而,有几种方法可以解决这个问题.一种方法是使用WHEN-TIMER-EXPIRED触发器.这是如何 -

WHEN-TIMER-EXPIRED

Begin    
if GET_APPLICATION_PROPERTY(TIMER_NAME) = 'NEW_TIMER' then    
   CALL_PROG_UNIT(); --This is your Procedure that calls the GO_BLOCK   
   /*Do rest of validation here*/
end if;
END;
Run Code Online (Sandbox Code Playgroud)

WHEN-VALIDATE-ITEM

DECLARE    
  timer_id TIMER;    
Begin        
  timer_id := CREATE_TIMER('NEW_TIMER',1,NO_REPEAT);    --set a short timer so that the WHEN-TIMER-EXPIRED trigger is fired immediately
End;
Run Code Online (Sandbox Code Playgroud)

会发生什么 - 这将在CREATE_TIMER调用函数后立即创建和终止计时器,然后表单级别触发器WHEN-TIMER-EXPIRED将检查过期的计时器名称并调用具有该函数的程序单元GO_BLOCK.希望这可以帮助.


UPDATE

Jeffery Kemp先生希望看到这个解决方案有效的证据.所以这里是 -

一个带有两个块BLOCK1BLOCK2带有文本项的Oracle表单

在此输入图像描述

WVI触发器

在此输入图像描述

WTE表单触发器.这首先调用P_CALL_PROC带有GO_BLOCK函数调用的PROGRAM UNIT ,然后对该字段进行一些验证Number 2.

在此输入图像描述

这是 P_CALL_PROC

在此输入图像描述

这是结果 -

在此输入图像描述

在此输入图像描述

是一个Youtube链接,可以查看表单的实际效果.

  • 不,wvi失败和wte失败之间存在很大差异.如果wvi失败,则该项目仍标记为"无效".如果wte失败,*在wvi成功之后,即使您的自定义验证过程失败,该项也将是"有效".是的,我同意这是一种解决方法,但我指出了它的一个潜在问题,主要是如果没有在wvi触发器的上下文中调用验证例程,则验证例程的工作方式不同. (3认同)
  • 布丁中的证明是,即使你的wte失败,用户也能够保存记录(连同无效值) - *除非你在其他地方添加额外的代码(例如,从预提交中再次调用验证例程)触发器或类似的东西). (2认同)