Tôi đã tìm thấy một mẹo nhỏ. Tôi không biết điều này an toàn như thế nào để chơi với nó, nhưng nó hoạt động. Có một sự kiện Oracle, 10237, được mô tả là "mô phỏng ^ C (cho mục đích thử nghiệm)".
Bạn phải có SID và SERIAL # của phiên bạn muốn làm gián đoạn.
Gọi SYS.DBMS_SYSTEM.SET_EV ( sid , sê-ri # , 10237, 1, '') để kích hoạt sự kiện trong phiên mục tiêu. Bất kỳ câu lệnh nào đang thực thi sẽ bị gián đoạn (nhận "ORA-01013:người dùng yêu cầu hủy hoạt động hiện tại"). Miễn là sự kiện được thiết lập, bất kỳ câu lệnh nào khác mà phiên cố gắng thực hiện sẽ ngay lập tức kết thúc với cùng một lỗi.
Để hủy kích hoạt sự kiện, hãy thực hiện cuộc gọi tương tự với tham số thứ tư được đặt thành "0". Sau đó, phiên sẽ có thể thực thi lại các câu lệnh.
Lưu ý rằng phiên mục tiêu phải phát hiện ra rằng sự kiện đã được thiết lập, điều này có thể mất thời gian hoặc có thể không bao giờ xảy ra, tùy thuộc vào những gì nó đang làm. Vì vậy, bạn không thể nhanh chóng bật và tắt sự kiện. Bạn cần phải bật nó lên, xác minh rằng câu lệnh được đề cập đã dừng, sau đó tắt nó đi.
Đây là một số mã mẫu. Điều này có nghĩa là được chạy như một khối ẩn danh trong SQLPlus, với các biến thay thế "sid" và "serial" được xác định một cách thích hợp. Bạn có thể biến nó thành một thủ tục được lưu trữ với những thứ đó là tham số của nó.
DECLARE
l_status v$session.status%TYPE;
BEGIN
dbms_system.set_ev( &sid, &serial, 10237, 1, '');
LOOP
SELECT status INTO l_status FROM v$session
WHERE sid = &sid and serial# = &serial;
EXIT WHEN l_status='INACTIVE';
END LOOP;
dbms_system.set_ev( &sid, &serial, 10237, 0, '');
END;