Oracle查询更新并返回更新的行

时间:2015-11-20 07:05:49

标签: sql oracle sql-update

我正在为分布式消息开发Oracle表。我有一张表如下:

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

当消息使用者查询消息时,我想通过尝试*小时更新提取时间并增加尝试次数:

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用

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.