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

ORA-14551:не може да изпълни DML операция вътре в заявка

Значението на грешката е съвсем ясно:ако извикаме функция от оператор SELECT, тя не може да изпълни DML оператори, това е INSERT, UPDATE или DELETE, или наистина DDL оператори стигат до това.

Сега кодовият фрагмент, който сте публикували, съдържа извикване на PIPE ROW, така че очевидно вие го извиквате като SELECT * FROM TABLE(). Но той включва оператори DELETE и INSERT, така че очевидно е в нарушение на нивата на чистота, изисквани за функциите в операторите SELECT.

Така че трябва да премахнете тези DML изрази. Вие ги използвате за попълване на глобална временна таблица, но това е добра новина. Не сте включили никакъв код, който действително използва GTT, така че е трудно да сте сигурни, но използването на GTT често не е необходимо. С повече подробности можем да предложим заобиколни решения.

Това свързано ли е с този друг ваш въпрос ? Ако е така, последвахте ли съвета ми да проверите този отговор, който бях дал на подобен въпрос ?

За пълнота е възможно да се включат DML и DDL оператори във функция, извикана в оператор SELECT. Заобиколното решение е да използвате прагмата AUTONOMOUS_TRANSACTION. Това рядко е добра идея и със сигурност не би помогнало в този сценарий. Тъй като транзакцията е автономна, промените, които прави, са невидими за извикващата транзакция. В този случай това означава, че функцията не може да види резултата от изтриването или вмъкването в GTT.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да добавя интервал пред моя номер, ако е едноцифрен?

  2. Oracle db присъединява срещу FROM a,b,c

  3. SQL произволен низ от списък

  4. Пример за клауза Oracle PIVOT с подзаявка

  5. ORA-22288:файлова или LOB операция FILEOPEN е неуспешна. Името на файла, името на директорията е неправилно