sql >> Databasteknik >  >> RDS >> Oracle

ORA-14551:kan inte utföra en DML-operation i en fråga

Innebörden av felet är ganska tydlig:om vi anropar en funktion från en SELECT-sats kan den inte köra DML-satser, det vill säga INSERT, UPDATE eller DELETE, eller DDL-satser kommer faktiskt till det.

Nu innehåller kodavsnittet du har postat ett anrop till PIPE ROW, så det är klart att du kallar detta som SELECT * FROM TABLE(). Men det inkluderar DELETE- och INSERT-satser så tydligt att det inte stämmer överens med renhetsnivåerna som krävs för funktioner i SELECT-satser.

Så du måste ta bort dessa DML-satser. Du använder dem för att fylla i en global tillfällig tabell, men det här är goda nyheter. Du har inte inkluderat någon kod som faktiskt använder GTT så det är svårt att vara säker, men att använda GTT är ofta onödigt. Med mer information kan vi föreslå lösningar.

Är detta relaterat till denna andra fråga ? Om så är fallet, följde du mitt råd att kolla det svaret jag hade gett på en liknande fråga ?

För fullständighetens skull är det möjligt att inkludera DML- och DDL-satser i en funktion som kallas i en SELECT-sats. Lösningen är att använda AUTONOMOUS_TRANSACTION-pragman. Detta är sällan en bra idé, och skulle absolut inte hjälpa i det här scenariot. Eftersom transaktionen är autonom är ändringarna som den gör osynliga för den anropande transaktionen. Betyder i detta fall att funktionen inte kan se resultatet av raderingen eller infogningen i GTT.



  1. Infoga med PreparedStatement. Hur ökar jag ID automatiskt?

  2. Sequelize sammanfogning av två tabeller som inte är associerade

  3. ClassNotFoundException i JDBC-programmet trots att förarens JAR-fil lagts till

  4. postgres kolumn alias problem