2016-09-28 60 views
1

爲什麼在Firebird中使用此代碼塊時,v_startv_end變量總是相等?爲什麼它總是返回null而沒有suspend聲明?Firebird中的執行塊或存儲過程中的時間戳不起作用

execute block 
returns (elapsed numeric(9,3), 
v_start timestamp, 
v_end timestamp) 
as 
declare variable i integer; 
begin 
    i = 1000000; 
    v_start = current_timestamp; 
    while (i > 0) do 
     i = i - 1; 

    v_end = current_timestamp; 

    elapsed = v_end - v_start; 

    suspend; 
end 

回答

4

是的,current_timestamp值保持一個PSQL模塊內是恆定的,這是documented(從說明部分引號):

在一個PSQL模塊(過程,觸發器或可執行塊),該值CURRENT_TIMESTAMP的每次讀取都會保持不變。如果多個模塊互相調用或觸發,則在最外層模塊的整個持續時間內,該值將保持不變。如果您需要PSQL中的進度值(例如測量時間間隔),請使用「NOW」。

使用SUSPEND的要求是documented太:

如果塊有輸出參數,你必須使用暫停或沒有將被退回。

+0

使用SUSPEND'的'是需要不是100%,但大部分的查詢工具將執行它作爲一個正常的語句(或可選擇的存儲過程)而不是作爲一個可執行的存儲過程;這意味着他們無法獲得一排。 –

0

有了這個代碼按預期工作...

execute block 
returns (elapsed bigint, 
v_start timestamp, 
v_end timestamp) 
as 
declare variable i integer; 
begin 
    i = 100000000; 
    v_start = 'now'; 
    while (i > 0) do 
     i = i - 1; 

    v_end = 'now'; 

    elapsed = datediff (second from cast(:v_start as timestamp) to cast('now' as timestamp)); 

    suspend; 
end