2017-07-25 14 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)は、1時間程度で表に公開されています。Oracle SQLに再帰関数を書き込む

Oracle SQLに関数(またはSQL問合せ)を作成して、後続のトランザクション時間がすべて前回のエントリより大きいか等しいことを確認しようとしています。

基本的に、AAAの2番目のエントリは、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'を生成するのは何ですか?おそらくデータベースの外にあるもの。 'order by 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時までに法案を納めなければ、私は大きな罰金を払うかもしれないと考えていますが、3分後にトランザクション時間が表示されます。誰が私の罰金を払うのだろう?なぜ? – mathguy

関連する問題