2017-07-25 148 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