2016-07-26 1 views
0

Oracleでユニークなタイムスタンプを作成したい場合は、以前のタイムスタンプをチェックし、以前に使用されていた場合は上書きする必要があります。 SQL Serverで作成しようとしましたが、動作しません。助けてくださいoracleにユニークなタイムスタンプを作成したい場合は、以前のタイムスタンプをチェックして、それが以前に使用されていた場合は上書きする必要がありますか?

+2

「ユニークなタイムスタンプ」が何を意味するのかよくわかりません。タイムスタンプは本質的にユニークではなく、同じ瞬間に2つのアクションが発生する可能性があります。単調に増加するシーケンスを作成し、一定の日付(1970年1月1日、2000年1月1日、1900年1月1日など)の後のシーケンスミリ秒というタイムスタンプを生成できます。これはユニークなものですが、何かが起きたときにフィールドが実際にあなたに伝えないでしょう... –

+0

私はこのような関数を作成する必要があります 1)タイムスタンプ(p1)を作成し、現在のタイムスタンプを保存します 2)別のタイムスタンプ(p2)でp1と比較する必要があります.p1 = p2の場合、00.009秒のような遅れで新しい関数を作成する必要があります –

+0

2つのローカル変数を生成し、両方に 'systimestamp'を割り当て、 2つのローカル変数を比較し、9ミリ秒間待ってから、もう一度 'systimestamp'を呼び出して、2番目のローカル変数の値を上書きします。最初は、2つの変数がほぼ確実に一致します(特にWindowsで実行している場合) 。 –

答えて

0

私はあなたがそのようなことをしたいと思うことは想像できません。あなたのリクエストはたぶん、代わりにあなたはそれを得るために起こるまでは、(潜在的に合理的にビジー状態のシステム内の回数のために)反復されます

create table all_timestamps_returned (
    ts timestamp primary key 
); 

create or replace procedure get_a_new_timestamp(p_new_ts out timestamp) 
as 
    l_ts timestamp := systimestamp; 
begin 
    insert into all_timestamps_returned(ts) 
    values(l_ts); 
    p_new_ts := l_ts; 
exception 
    when dup_val_on_index 
    then 
    dbms_lock.sleep(0.01); 
    get_a_new_timestamp(p_new_ts); 
end; 

ような何かを探しています。この

create or replace function this_is_silly 
    return timestamp 
is 
    t1 timestamp := systimestamp; 
    t2 timestamp := systimestamp; 
begin 
    if(t1 = t2) 
    then 
    dbms_lock.sleep(0.01); 
    t2 := systimestamp; 
    end if; 
    return t2; 
end; 

に変換するように見えます固有のタイムスタンプまたは最大再帰制限を使い果たします。ループを使ってこれを繰り返し実行することもできますが、ユニークなタイムスタンプを取得せずに50回再試行した場合は、何らかのフェールセーフが必要になることがあります。繰り返しますが、複数のイベントが同時に発生し、シーケンスを使用して固有のキーを生成することを認識するのではなく、なぜこれを行う必要があるのか​​わかりません。しかし、あなたはできます。

+0

私の推測では、@ gowtham_dontuは関数によって生成されたタイムスタンプを保存し、後続の呼び出しで次のタイムスタンプが前のものと異なることを保証します1。 –

関連する問題