Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:Tôi có thể nói theo chương trình nếu một thủ tục có chứa một cam kết không?

Tôi có một thủ tục gói mà tôi đã viết cho việc này. Tôi sẽ dán mã bên dưới.

Để sử dụng nó, chỉ cần gọi "start_no_commit_section" với tên bạn đặt. Sau đó, hãy gọi "end_no_commit_section" với cùng tên. Nếu một cam kết (hoặc khôi phục) đã được đưa ra, lệnh gọi đến "end_no_commit_section" sẽ phát sinh lỗi.

Rất tiếc, điều này không cho bạn biết ở đâu cam kết đã xảy ra. Nếu tôi có nhiều mã để xem qua, nói chung tôi sẽ chạy DBMS_HPROF trên mã của mình và sau đó tìm kiếm một cam kết trong kết quả HPROF (sẽ cho tôi biết số dòng chính xác).

  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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị nhiều giá trị của một cột trong một hàng (SQL Oracle)

  2. Oracle - Bảng sao chép - Cấu trúc, ràng buộc dữ liệu và tất cả

  3. Cập nhật bảng từ một bảng khác trong oracle

  4. Hợp nhất một số trình kích hoạt Oracle. Bất kỳ tác động đến hiệu suất?

  5. Lỗi cú pháp trong câu lệnh SQL ngoại lệ ném từ khóa “WITH”