2016-07-26 17 views
0

我想在Oracle中創建一個唯一的時間戳,它應該檢查以前的時間戳並覆蓋它以前是否使用。我試圖在SQL Server中創建一個,但它不起作用。請幫忙我想在oracle中創建一個唯一的時間戳,它應該檢查以前的時間戳並覆蓋它以前是否使用過?

+2

我不確定什麼「獨特的時間戳」對您意味着什麼。時間戳本質上不是唯一的 - 兩個動作可能在同一時刻發生。你可以有一個單調遞增的序列並生成一個時間戳,比如說,在某個固定日期(1970年1月1日,2000年1月1日,1900年1月1日等)之後的毫秒數。這將是唯一的,但該領域不會真的告訴你什麼時候發生了什麼...... –

+0

我需要創建一個這樣的功能 1)創建一個時間戳(p1),存儲當前時間戳 2)之後,它應該創建另一個時間戳(p2),它應該與p1比較,如果p1 = p2,函數應該創建一個新的延遲,如00.009秒 –

+0

您想要一個函數生成兩個局部變量,將它們都分配爲'systimestamp',比較兩個局部變量,等待9毫秒,然後再次調用'systimestamp'來覆蓋第二個局部變量的值......最初,這兩個變量幾乎肯定會匹配(特別是如果你在Windows上運行的話) 。 –

回答

0

我無法想象爲什麼你會想要做這樣的事情。您的要求似乎翻譯爲這個

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; 

也許不是你喜歡

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; 

這將迭代(可能在一個相當繁忙的系統多次),直到它發生得找東西一個獨特的時間戳或你耗盡你的最大遞歸限制。你可以使用一個循環迭代地實現它,但如果你重試了50次而沒有獲得唯一的時間戳,那麼你可能想要進行某種失敗保護。再次,我不確定爲什麼你想要這樣做,而不是認識到可以同時發生多個事件並使用序列來生成唯一密鑰。但你可以。

+0

函數(pl \ sql代碼)嗎?我的猜測是,@ gowtham_dontu意思是存儲函數產生的時間戳,並在隨後的調用中確保下一個時間戳與以前不同一。 –