2017-07-25 149 views
0
ORDER_ID        TRANSACT_TIME 
AAA          24-JUL-17 04.05.54.491000000 PM 
AAA          24-JUL-17 04.05.54.496000000 PM 
AAA          24-JUL-17 04.05.54.504000000 PM 
BBB          24-JUL-17 04.05.54.491000000 PM 
BBB          24-JUL-17 04.05.54.497000000 PM 
BBB          24-JUL-17 04.05.54.505000000 PM 
...          ... 

此数据(订单ID和Transaction_Time)每小时左右发布到表中。在Oracle中编写递归函数SQL

我想在Oracle SQL中创建一个函数(或SQL查询)以确保每个后续事务时间大于或等于先前的条目。

基本上AAA中的第二个条目不能比AAA中的第一个条目具有更早的事务时间,依此类推。

我想就如何去写这个函数做一些指导。一个想法,我发现是写一个递归函数,我想是这样的,但我不完全知道是怎么回事:

 Note: PREV_TRANS_TIME is an alias I generated to grab the transaction 
    time of the previous transaction (meaning for first entry PREV_TRANS_TIME = null) 

     CREATE OR REPLACE FUNCTION TransactTimeChecker(PREV_TRANS_TIME) RETURN STRING AS 
     BEGIN 
      IF prev_trans_time > transact_time THEN 
         RETURN (I'm not sure what to write 
           here but I need to fix the entries so the order is adjusted) 
      ELSIF prev_trans_time <= transact_time THEN 
         RETURN (we are good, no problem) 
      ELSE 
         --Do nothing 
      END IF; 
     END; 
+1

当您引用具有相同'order_id'的行时,可以使用“后续”,“前一个”,“第二个”,“第一个”等词。这意味着他们以某种方式被命令。与您在纸上或屏幕上看到的不同,数据库中的行不是**排序的。你需要一个明确的排序标准,然后才能说出“后续”等。明显的排序是通过'transact_time'来完成的,但显然在你的问题中情况并非如此,因为你必须检查事务处理的时间实际上是否正确。其他**排序是否有,以确定“第一”,“第二”等?你没有提到任何。 – mathguy

+0

表上的检查约束可能是此需求的最佳解决方案。你看过他们(例如https://www.techonthenet.com/oracle/check.php)。 –

+0

我同意@Mathguy。这看起来像是一个架构问题。什么产生'order_id,transact_time'?大概是数据库之外的东西。为什么按照transact_time排序不能保证正确的排序? – APC

回答

0

我不认为你需要递归。我假设prev_trans_time是最后使用的订单时间。你想等到你有新的时间来创建下一个交易。你的函数可以迭代直到系统时间增加。

declare 
    transact_time date := sysdate; 
begin 
    while (prev_trans_time > transact_time) loop 
     transact_time := sysdate; 
    end loop; 
    return transact_time; 
end; 
+0

如果您希望交易时间是唯一的,因为它是密钥的一部分,您最好使用身份或序列号作为密钥并保留实际的交易时间。 – LAS

+0

这个建议如果得到执行,可能会导致很大的麻烦,根据应用程序的不同,这可能是非法的。交易时间是交易时间,而不是其他时间计算谁知道什么样的方式。想象一下,除非我在4月30日午夜12点前付清账单,否则我可能会支付巨额罚款,但您的申请表示我没有 - 它显示三分钟后的交易时间。谁会支付我的罚款,为什么? – mathguy