2016-09-28 59 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