sql >> Databáze >  >> RDS >> Oracle

ORA-14551:Nelze provést operaci DML uvnitř dotazu

Význam chyby je zcela jasný:voláme-li funkci z příkazu SELECT, nemůže provádět příkazy DML, tedy INSERT, UPDATE nebo DELETE, nebo k tomu skutečně dochází příkazy DDL.

Úryvek kódu, který jste odeslali, nyní obsahuje volání PIPE ROW, takže to zjevně voláte jako SELECT * FROM TABLE(). Zahrnuje však příkazy DELETE a INSERT tak jasně, že je v rozporu s úrovněmi čistoty požadovanými pro funkce v příkazech SELECT.

Musíte tedy tyto příkazy DML odstranit. Používáte je k naplnění globální dočasné tabulky, ale to je dobrá zpráva. Nezahrnuli jste žádný kód, který skutečně používá GTT, takže je těžké si být jistý, ale použití GTT je často zbytečné. S dalšími podrobnostmi můžeme navrhnout náhradní řešení.

Souvisí to s tato další vaše otázka ? Pokud ano, řídili jste se mou radou zkontrolovat tuto odpověď jsem dal na podobnou otázku ?

Pro úplnost je možné zahrnout příkazy DML a DDL do funkce volané v příkazu SELECT. Řešením je použití pragma AUTONOMOUS_TRANSACTION. To je málokdy dobrý nápad a v tomto scénáři by to rozhodně nepomohlo. Protože je transakce autonomní, změny, které provede, jsou pro volající transakci neviditelné. V tomto případě to znamená, že funkce nevidí výsledek smazání nebo vložení do GTT.



  1. mysql na csv bez použití INTO OUTFILE mysql

  2. Výstupní parametr uložených procedur MySQL přes ADODB v MS Access (VBA) správný na jednom počítači a náhodný na jiném

  3. java.lang.ClassNotFoundException:com.mysql.jdbc.Driver (maven + jboss)

  4. MySQL Spustí po aktualizaci pouze v případě, že se řádek změnil