Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle:Czy mogę programowo stwierdzić, czy procedura zawiera zatwierdzenie?

Mam procedurę pakietu, którą napisałem do tego. Wkleję kod poniżej.

Aby z niego skorzystać, po prostu zadzwoń do "start_no_commit_section" podając nazwę. Następnie wywołaj „end_no_commit_section” o tej samej nazwie. Jeśli wydano zatwierdzenie (lub wycofanie), wywołanie „end_no_commit_section” zgłosi błąd.

Niestety, nie mówi Ci to, gdzie popełnienie się stało. Jeśli mam dużo kodu do przejrzenia, zazwyczaj uruchamiam DBMS_HPROF na moim kodzie, a następnie szukam zatwierdzenia w wynikach HPROF (które podadzą mi dokładny numer wiersza).

  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. Oracle DataReader zwraca 1 wiersz, ale metoda Read zwraca wartość false

  2. Pobieranie wartości z tabeli Oracle DB do pola listy w c# /wpf

  3. Co oznacza select count(1) z table_name w dowolnych tabelach bazy danych?

  4. Jak zrozumieć statystyki pliku śledzenia w Oracle. Takich jak procesor, upływający czas, zapytanie ... itp

  5. Oracle BI:Wybierz wszystkie rekordy z zeszłego tygodnia