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

Oracle:プロシージャにコミットが含まれているかどうかをプログラムで確認できますか?

    このために書いたパッケージ手順があります。以下のコードを貼り付けます。

    これを使用するには、指定した名前で「start_no_commit_section」を呼び出すだけです。その後、同じ名前で「end_no_commit_section」を呼び出します。コミット(またはロールバック)が発行された場合、「end_no_commit_section」を呼び出すとエラーが発生します。

    残念ながら、これでは場所はわかりません。 コミットが発生しました。調べるコードがたくさんある場合は、通常、コードでDBMS_HPROFを実行してから、HPROFの結果でコミットを探します(正確な行番号がわかります)。

      CREATE OR REPLACE PACKAGE BODY XXCUST_TRANSACTION_UTIL AS
      ----------------------------------------------------------------
      -- See package spec for comments
      ----------------------------------------------------------------
      TYPE no_commit_section_t IS RECORD (local_transaction_id VARCHAR2 (200));
    
      TYPE no_commit_sections_tab IS TABLE OF no_commit_section_t
                                       INDEX BY VARCHAR2 (80);
    
      g_no_commit_sections   no_commit_sections_tab;
    
      PROCEDURE start_no_commit_section (p_section_name VARCHAR2) IS
        l_section   no_commit_section_t;
      BEGIN
        l_section.local_transaction_id                          := DBMS_TRANSACTION.local_transaction_id (create_transaction => TRUE);
        g_no_commit_sections (SUBSTR (p_section_name, 1, 80))   := l_section;
      END start_no_commit_section;
    
    
      PROCEDURE end_no_commit_section (p_section_name VARCHAR2) IS
        l_local_transaction_id   VARCHAR2 (200);
      BEGIN
        l_local_transaction_id   := DBMS_TRANSACTION.local_transaction_id (create_transaction => TRUE);
    
        IF l_local_transaction_id != g_no_commit_sections (SUBSTR (p_section_name, 1, 80)).local_transaction_id THEN
          -- There has been a commit or a rollback in the no-commit section
          raise_application_error(-20001,'A commit or rollback has been detected in "No commit" section ' || p_section_name || '.');
        END IF;
      EXCEPTION
        WHEN no_data_found THEN
          -- Caller specified a non-existent commit section
          raise_application_error(-20001,'"No commit" section ' || p_section_name || ' not established.');
      END end_no_commit_section;
    END XXCUST_TRANSACTION_UTIL;
    


    1. MySQL:どのテーブルが特定のテーブルを参照しているかを確認するにはどうすればよいですか?

    2. groupbyと結合を含むSQLクエリ

    3. AVG行の長さが予想の4倍になるのはなぜですか?

    4. SQL2005ServerからTimeZoneInfoにアクセスします