2014-01-29 29 views
0

我想在每次有人请求新的任务集(运行BIRT报告)时从表中显示5个任务(行)。条件是一旦显示任务,则在接下来的X秒内不能再显示相同的任务。匿名任务锁定

的样本数据:

/* 
-- drop table if exists task_list; 

-- Create table for tasks 
create table task_list (
    id_task serial, 
    task_lock timestamp without time zone 
); 

-- Insert some tasks 
insert into task_list select * from generate_series(1,100); 
*/ 

为了达到要求的行为,我创建的查询与update内CTE:

with 

tasks as (
    update task_list set task_lock = Now() 
    where 
    id_task in (select id_task 
       from task_list 
       where task_lock is null 
       or task_lock < (Now() - interval '30 seconds') limit 5) 
    returning * 
) 

select * from tasks; 

这工作完全当我从pgAdmin的反复运行查询,而不是当我将此查询添加到BIRT报告。这在SQLFiddle中也不起作用。在这两种工具中,始终只显示前5行。

+0

报告你在哪里添加此?我的直觉是它只被调用一次(可能是在第一次生成报告时)。 – venite

+0

@venite我添加了这个标准的数据集(直接粘贴SQL到查询窗口),使用JDBC连接到PostgreSQL。每当我在报告查看器中进行刷新时,都会对查询进行评估。我通过在数据集中添加'now()'列来验证这一点 - 它在[SQLFiddle](http://sqlfiddle.com/#!15/dfb45/5)中的工作方式相同, –

回答

0

为了使这项工作,你必须的数据源的&AutoCommit属性设置为true

作品在BIRT设计4.2.2及有关BIRT查看器