我正在为分布式消息开发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)。答案 0 :(得分:1)
您可以使用
在 PL / SQL 中执行此操作例如,在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.