Tôi muốn thực hiện ghi nhật ký tất cả các câu lệnh được thực hiện với các tham số liên kết thực tế khi sử dụng Oracle JDBC. Và tôi thích rằng tôi có thể tạo phương thức ghi như vậy chỉ truyền đối tượng PreparedStatement làm tham số.Cách lấy giá trị của các tham số liên kết từ đối tượng Oracle JDBC PreparedStatement
Ví dụ tôi đã tạo PreparedStatement và chịu ràng buộc một tham số
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM employees WHERE employee_id = ?");
ps.setInt(1,1);
Bây giờ tôi muốn để có thể nhận được từ ps các câu lệnh SQL thực tế "SELECT * FROM nhân viên ĐÂU employe_id = 1" mà tôi có thể đặt vào tệp nhật ký.
Cho đến nay tôi thấy rằng tôi có thể sử dụng
((oracle.jdbc.driver.OracleStatement) ps).getOriginalSql()
để có được
SELECT * FROM employees WHERE employe_id = ?
Bây giờ tôi cần một số cách để có được danh sách các biến ràng buộc hiện tại từ ps vì vậy mà tôi có thể thay thế? với các giá trị tham số liên kết.
Tôi cố gắng tìm trong ps.getClass() getDeclaredFields() và ps.getClass(). GetSuperclass(). GetDeclaredFields() nhưng cho đến nay không thể tìm thấy vị trí mà giá trị tham số liên kết và loại của chúng được lưu trữ .
Bất kỳ đề xuất nào để tìm kiếm chúng?
Tôi vẫn cần tạo nó ngay từ PreparedStatement. Tôi cần điều này cho một thư viện, nơi tôi thêm hỗ trợ Oracle ngoài MySQL và PostgreSQL và các cơ sở dữ liệu khác và có chức năng ghi nhận chấp nhận đối tượng PreparedStatement như đối số. Trong trình điều khiển JDBC của MySQL và PostgreSQL nếu bạn gọi toString() trên đối tượng PreparedStatement thì nó trả về SQL với các tham số liên kết kèm theo - tôi cần triển khai chức năng tương tự cho Oracle. –
Sau đó, có thể thay đổi thư viện để hoạt động theo cách này? Khác hơn thế, bắt đầu gỡ lỗi mã oracle của bạn và phá vỡ các tuyên bố chuẩn bị. Sau đó, xem cấu trúc và định vị địa điểm riêng nơi lưu trữ các giá trị. – akarnokd
Vấn đề này có mùi giống như ORM ở đằng kia ... – ATorras