2015-11-20 79 views
2

我正在为分布式消息开发Oracle表。我有一个表,如下所示:Oracle查询更新和返回更新行

TABLE messages 
messageid VARCHAR(15) 
pulltime  DATETIME 
attempt  NUMBER(100) 

当消息消费者查询的消息,我想尝试更新pulltime *小时递增尝试号码:

UPDATE messages 
    SET pulltime = SYSDATE + attempt/24, attempt = attempt + 1 
    WHERE pulltime < SYSDATE; 

同时,无论更新什么,我也想查询它并将行返回给我的应用程序,以处理消息。由于有多个消费者,我希望能够更新准备处理的消息,并更新他们的pulltime以锁定其他消费者使用相同的消息,直到一次操作中的下一个pulltime(如果消息成功消费,我们将使用单独的命令从表中删除条目)。

编辑:消费应用程序将是一个Java应用程序,我希望所有的列返回(messageid,pulltime和尝试)。

+0

消息如何查询消息?这是在pl/sql函数还是程序里面? – Hawk

+0

它将通过Java应用程序。 – VerticalEvent

回答

0

你可以通过做在PL/SQL

  • FOR UPDATE条款 - 将锁定从其他会话要更新的行
  • RETURNING INTO条款 - 将返回的行正在更新

例如,在SCOTT模式中使用标准EMP表:

SQL> set serveroutput on 
SQL> DECLARE 
    2 v_empno NUMBER; 
    3 BEGIN 
    4 FOR i IN 
    5 (SELECT * FROM emp WHERE deptno = 10 FOR UPDATE 
    6 ) 
    7 LOOP 
    8  UPDATE emp SET deptno = 99 WHERE empno = i.empno RETURNING empno INTO v_empno; 
    9  DBMS_OUTPUT.PUT_LINE('updated empno is = '||v_empno); 
10 END LOOP; 
11 END; 
12/
updated empno is = 7782 
updated empno is = 7839 
updated empno is = 7934 

PL/SQL procedure successfully completed. 
+0

你应该添加提交来释放锁吗? – Moudiz

+0

@Moudiz当然可以。或者,使用'SKIP LOCKED'跳过已锁定的行,不要等待。我将这部分留给OP,因为我已经提到FOR UPDATE会锁定行。很明显,COMMIT将由呼叫环境完成。 –

+0

我试着运行上面的命令,结果返回0条记录。 – VerticalEvent