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

Řešení, které nemůže provést operaci DML uvnitř dotazu?

Můžete použít direktivu pragma autonomous_transaction . Tím se funkce spustí do nezávislé transakce, která bude schopna provádět DML bez zvýšení ORA-14551.

Uvědomte si, že vzhledem k tomu, že autonomní transakce je nezávislá, výsledky DML budou potvrzeny mimo rozsah nadřazené transakce. Ve většině případů by to nebylo přijatelné řešení.

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2)
  2     RETURN VARCHAR2 IS
  3     PRAGMA AUTONOMOUS_TRANSACTION;
  4  BEGIN
  5     INSERT INTO dumtab VALUES (datainput);
  6     COMMIT;
  7     RETURN 'done';
  8  END supercomplex;
  9  /

Function created

SQL> SELECT supercomplex('somevalue') FROM dual;

SUPERCOMPLEX('SOMEVALUE')
--------------------------------------------------------------------------------
done

SQL> select * from dumtab;

A
--------------------------------------------------------------------------------
somevalue

Tom Kyte má pěkné vysvětlení toho, proč se chyba objevila na prvním místě. Není to bezpečné, protože může záviset na pořadí, ve kterém jsou řádky zpracovávány. Oracle dále nezaručuje, že funkce bude provedena alespoň jednou a maximálně jednou na řádek.



  1. Redundance N+1 a konsolidace serverů

  2. ORA - 00933 záměna s vnitřním spojem a as

  3. Proč iterace přes velký Django QuerySet spotřebovává obrovské množství paměti?

  4. Převeďte časové razítko Unixu na člověkem čitelné datum pomocí MySQL