【问题标题】:When :system_mode = 'query' then null当 :system_mode = 'query' 然后为 null
【发布时间】:2020-12-07 05:47:11
【问题描述】:

我正在创建触发器以在 oracle 表单 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;

但不工作。触发器为发票提供最大值#。

【问题讨论】:

  • 我不确定,但您是否尝试过 ENTER-QUERYQUERY 大写模式?

标签: oracle oracleforms


【解决方案1】:

SYSTEM.MODE 有 3 个有效值:

  • 正常
  • 输入-查询
  • 查询

全部大写。没有EXECUTE


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

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

【讨论】:

  • 我试过 (IF :SYSTEM.MODE = 'QUERY' 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 = 'NORMAL' THEN SELECT NVL(MAX(INV),0)+1 INTO :SA.INV FROM ALFA.SA WHERE MM_YY = :MM_YY; ELSE NULL ; 结束如果;)
  • 显示该系统变量的值,以便您查看所拥有的。使用内置的 MESSAGE 来做到这一点,例如message('Current mode is ' || :system.mode);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多