sql >> データベース >  >> RDS >> Oracle

クエリ内でDML操作を実行できない解決策はありますか?

    ディレクティブpragma autonomous_transactionを使用できます 。これにより、ORA-14551を発生させずにDMLを実行できる独立したトランザクションに関数が実行されます。

    自律型トランザクションは独立しているため、DMLの結果は親トランザクションのスコープ外でコミットされることに注意してください。ほとんどの場合、これは許容できる回避策ではありません。

    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
    

    トム・カイトは、そもそもエラーが発生する理由について素晴らしい説明をしています。行が処理される順序に依存する可能性があるため、安全ではありません。さらに、Oracleは、関数が行ごとに少なくとも1回、最大で1回実行されることを保証しません。



    1. ワーカースレッドが不足するトラブルシューティング

    2. MariaDB USER()の説明

    3. Microsoft Accessは簡単に習得できますか?

    4. SQL ServerCompactEditionでLIKEでパラメータを使用する方法