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;
同じ「order_id」の行を参照するときは、「後」、「前」、「次」、「最初」などの単語を使用します。それは何とか注文されたことを意味します。紙や画面に表示されるものとは異なり、データベースの行は**注文されていません**。 「後続」などを話すには、明示的な発注基準が必要です。明示的な順序は 'transact_time'によって行われますが、実際に正しい順序でトランザクション時間がチェックされなければならないので、明らかにあなたの問題ではありません。何が**他の**注文は、 "第一"、 "第二"などを決定するためにそこにありますか?あなたは何も言及していませんでした。 – mathguy
おそらくテーブルのチェック制約がこの要件のための最良の解決策であるかもしれません。それらを見ましたか(例:https://www.techonthenet.com/oracle/check.php)。 –
私は@Mathguyに同意します。これは建築上の問題のようです。 'order_id、transact_time'を生成するのは何ですか?おそらくデータベースの外にあるもの。 'order by transact_time'が正しい注文を保証しないのはなぜですか? – APC