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;