【问题标题】:Oracle trigger on same table同一张表上的Oracle触发器
【发布时间】:2020-10-09 00:03:57
【问题描述】:

我正在查看触发器,但无法理解正确的含义。

这是触发器 DDL。

BEGIN
:new.C_DATE:=round((cast(sys_extract_utc(current_timestamp) as date) - TO_DATE('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) * 86400)*1000;
:new.U_DATE:=round((cast(sys_extract_utc(current_timestamp) as date) - TO_DATE('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) * 86400)*1000;
END;

据我了解,他们只是将当前时间戳值获取为纪元格式并将其转换为 UTC,并将其分配给 C_DATE 和 U_DATE 列。

来自信息架构:

触发器类型:每行之前

触发事件:插入

正确吗?他们是否将这个 epoch 值插入到 C_DATE 和 U_DATE 列的同一个表中?

【问题讨论】:

  • 看起来就是这样,是的。这不是您在本地测试时看到的吗?您只是在寻找是或否的答案吗?
  • 其实我不知道这个触发器在做什么。我想了解它

标签: oracle plsql triggers


【解决方案1】:

触发器使用 Unix Epoch 填充值并将其乘以 1000 - 即 Unix Epoch 以毫秒为单位:-)

通过在 SQL*Plus 上执行来测试它:

select 
  to_char(round((cast(sys_extract_utc(SYSTIMESTAMP) as date) - 
                 TO_DATE('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) 
      * 86400) * 1000, 
      '999999999999999')
from 
   dual;

在连接到 Stratum 0 时间服务器的数据库机器上(通常生产环境得到这个),然后从地址更新浏览器中的页面

https://www.epochconverter.com/

SQL*PLUS:

TO_CHAR(ROUND((C
----------------
1602172506000

网页:

1602172507

当您将网页价值乘以 1000 时,您会得到

1602172507000

距离 SQL*Plus 仅一秒(或 1000 毫秒)(我切换速度非常快 :-)

【讨论】:

  • 但是触发器,是把这个epoch值插入到自己的表中吗?>
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多