Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle:Bisakah saya memberi tahu secara terprogram jika suatu prosedur berisi komit?

Saya memiliki prosedur paket yang saya tulis untuk ini. Saya akan menempelkan kode di bawah ini.

Untuk menggunakannya, panggil saja "start_no_commit_section" dengan nama yang Anda berikan. Kemudian, nanti, panggil "end_no_commit_section" dengan nama yang sama. Jika komit (atau rollback) telah dikeluarkan, panggilan ke "end_no_commit_section" akan menimbulkan kesalahan.

Sayangnya, ini tidak memberi tahu Anda di mana komit itu terjadi. Jika saya memiliki banyak kode untuk dilihat, saya biasanya akan menjalankan DBMS_HPROF pada kode saya dan kemudian mencari komit dalam hasil HPROF (yang akan memberi tahu saya nomor baris yang tepat).

  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. Panggilan prosedur tersimpan dengan kursor melempar pengecualian nama kolom yang tidak valid

  2. Pola pengamat di Oracle

  3. ORA-22813:nilai operan melebihi batas sistem

  4. Ulangi semua skema di Talend

  5. Membuat Profil Di Oracle Untuk Keamanan Pengguna