Oracle
 sql >> Baza danych >  >> RDS >> Oracle

ORA-14551:nie można wykonać operacji DML w zapytaniu

Znaczenie błędu jest dość jasne:jeśli wywołamy funkcję z instrukcji SELECT, nie może ona wykonać instrukcji DML, czyli INSERT, UPDATE lub DELETE, lub rzeczywiście dochodzi do tego instrukcje DDL.

Fragment kodu, który wysłałeś, zawiera wywołanie PIPE ROW, więc po prostu wywołujesz to jako SELECT * FROM TABLE(). Ale zawiera instrukcje DELETE i INSERT, więc wyraźnie nie spełnia poziomów czystości wymaganych dla funkcji w instrukcjach SELECT.

Musisz więc usunąć te instrukcje DML. Używasz ich do zapełniania globalnej tabeli tymczasowej, ale to dobra wiadomość. Nie dołączyłeś żadnego kodu, który faktycznie używa GTT, więc trudno mieć pewność, ale używanie GTT jest często niepotrzebne. Mając więcej szczegółów, możemy zaproponować obejścia.

Czy ma to związek z to inne twoje pytanie ? Jeśli tak, czy zastosowałeś się do mojej rady, aby sprawdzić odpowiedź, której udzieliłem na podobne pytanie ?

W trosce o kompletność możliwe jest uwzględnienie instrukcji DML i DDL w funkcji wywoływanej w instrukcji SELECT. Obejściem tego problemu jest użycie pragma AUTONOMOUS_TRANSACTION. Rzadko jest to dobry pomysł i na pewno nie pomogłoby w tym scenariuszu. Ponieważ transakcja jest autonomiczna, wprowadzane przez nią zmiany są niewidoczne dla transakcji wywołującej. Oznacza to w tym przypadku, że funkcja nie widzi wyniku usunięcia lub wstawienia w 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. literał nie pasuje do błędu ciągu formatu podczas aktualizacji tabeli sql

  2. Przebieg logowania w R12.2 i podstawowe rozwiązywanie problemów

  3. Oracle :Eksportuj zestaw wyników instrukcji SELECT jako INSERT SQL Statements podobny do eksportu programisty SQL

  4. Jak dodać atrybut do xml zawartego w CLOB w bazie danych Oracle?

  5. java.sql.SQLException:ORA-01652:nie można rozszerzyć segmentu temp o 128 w tablespace TEMP (nawet po rozszerzeniu)