当 :system_mode = 'query' 时为空

When :system_mode = 'query' then null

我正在创建触发器以在 oracle forms 11g 中获取最大发票#,它运行良好。

但我需要 :system.mode in ('execute','query') 时触发将不起作用。

我正在尝试

if :system.mode ='execute' then
   null;
else
   SELECT NVL(MAX(INV),0)+1 INTO :SA.INV FROM ALFA.SA WHERE MM_YY = :MM_YY;
end if;

但是触发器在两种模式下都给出最大发票#。我只需要正常或插入模式。

我也试试

if :system.mode ='query' then
   null;

但不工作。触发给发票#的最大值。

SYSTEM.MODE 有 3 个有效值:

  • 正常
  • 输入查询
  • 查询

全部大写。没有EXECUTE.


而且,你的做法是错误的。只要它在单用户环境中工作,它就会在多用户环境中失败,因为迟早会有两个(或更多)用户从 table 中获取相同的 MAX(INV)使 :SA.INV 重复 。如果它是主键或唯一键,您甚至无法将其存储到 table(第一个提交的用户除外)。

有一种方法可以做到这一点(使用包含下一个有效值的 table,由自主事务函数获取),但是 - 我建议您切换到 sequence 或 - 如果您的数据库版本支持它 - identity 列。