Oracle
 sql >> база данни >  >> RDS >> Oracle

атомно сравняване и размяна в база данни

PK първичен ключ ли е? Тогава това не е проблем, ако вече знаете първичния ключ, няма спорт. Ако pk е първичния ключ, тогава това повдига очевидния въпрос как знаете ли pk на елемента за изваждане от опашката...

Проблемът е, ако не знаете първичния ключ и искате да извадите от опашката следващия „наличен“ (т.е. статус =y) и да го маркирате като изваден от опашката (изтрийте го или задайте статус =z).

Правилният начин да направите това е да използвате един израз. За съжаление синтаксисът се различава между Oracle и SQL Server. Синтаксисът на SQL Server е:

update top (1) [<table>]
set status = z 
output DELETED.*
where  status = y;

Не съм достатъчно запознат с клаузата RETURNING на Oracle, за да дам пример, подобен на OUTPUT на SQL.

Други решения на SQL Server изискват подсказки за заключване на SELECT (с UPDLOCK), за да бъдат правилни. В Oracle предпочитаният път е използването на FOR UPDATE, но това не работи в SQL Server, тъй като FOR UPDATE трябва да се използва във връзка с курсори в SQL .

Във всеки случай поведението, което имате в оригиналния пост, е неправилно. Няколко сесии могат да избират един и същи ред(ове) и дори всички да го актуализират, връщайки един и същ елемент(и) от опашката на множество читатели.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуване на XSD дата xs:dateTime в дата на Oracle

  2. Динамичен текущ сбор

  3. Как да разрешим ORA-00939:твърде много аргументи за функционална грешка?

  4. Вмъкване на няколко записа в oracle

  5. Откриване, изтриване на празни колони и актуализиране на база данни в sql, oracle