Что не так с моим выбором для обновления пропустить заблокированный oracle запрос - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно обновить несколько записей в таблице, сопоставляя определенный столбец (в данном случае dest_file_path). Я присоединяюсь к столу с собой. Внутренний выбор, чтобы объединить соответствующий столбец с одной и той же таблицей, чтобы получить все записи с одним соответствующим столбцом

update job_queue 
set status = 'RUNNING', last_updated_time = systimestamp 
where rowid in
(
select jq.rowid from job_queue jq,
(select DEST_FILE_PATH from JOB_QUEUE 
where status not in ('RUNNING','FINISHED','SKIPPED') and operation_type in ('copy') 
order by case when status='FAILED' then 0 else 1 end desc, dest_file_path fetch first 1 rows only) dest
where jq.dest_file_path = dest.dest_file_path and jq.operation_type='copy'
)
for update skip locked;

К сожалению, я получаю эту ошибку:

Error at Command Line : 25 Column : 1
Error report -
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:

Хотя, если Я делаю простой выбор вместо обновления, он работает просто отлично. Вот запрос на выбор.

select rowid,dest_file_path from job_queue
where rowid in
(
select jq.rowid from job_queue jq,
(select DEST_FILE_PATH from JOB_QUEUE 
where dest_file_path='/file/path' 
and status not in ('RUNNING','FINISHED','SKIPPED') and operation_type in ('copy') 
order by case when status='FAILED' then 0 else 1 end desc, dest_file_path fetch first 1 rows only) dest
where jq.dest_file_path = dest.dest_file_path and jq.operation_type='copy'
)
for update skip locked;

Любые предложения о том, как заняться обновлением.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вы можете выполнить свой запрос, используя pl / sql.

BEGIN
   FOR R
      IN (SELECT JQ.ROWID
            FROM JOB_QUEUE JQ,
                 (SELECT *
                    FROM (  SELECT DEST_FILE_PATH
                              FROM JOB_QUEUE
                             WHERE     STATUS NOT IN ('RUNNING',
                                                      'FINISHED',
                                                      'SKIPPED')
                                   AND OPERATION_TYPE IN ('copy')
                          ORDER BY (CASE STATUS
                                       WHEN 'FAILED' THEN 0
                                       ELSE 1
                                    END) DESC)
                   WHERE ROWNUM = 1) DEST
           WHERE     JQ.DEST_FILE_PATH = DEST.DEST_FILE_PATH
                 AND JQ.OPERATION_TYPE = 'copy'
          FOR UPDATE
             SKIP LOCKED)
   LOOP
      UPDATE JOB_QUEUE
         SET STATUS = 'RUNNING', LAST_UPDATED_TIME = SYSTIMESTAMP
       WHERE ROWID = R.ROWID;
   END LOOP;
END;
/
0 голосов
/ 14 апреля 2020

Предложение for update существует только для операторов select, но не для операторов update (которые должны блокировать строки, которые они обновляют). Звучит так, будто вы хотите сначала запустить select for update, загрузить ключи в локальную переменную / коллекцию, а затем выполнить update, используя значения, которые вы сохранили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...