Trong trình kích hoạt, tôi muốn xem truy vấn sql nào đã kích hoạt trình kích hoạt này. Tôi đã sử dụng hàm current_query() của postgresql (8.4).
Mọi thứ đều ổn, nhưng nếu trình kích hoạt được thực hiện bằng câu lệnh đã chuẩn bị, tôi sẽ nhận được phần giữ chỗ ($ 1) thay vì giá trị chính xác. ví dụ: (truy vấn đã đăng nhập):
delete from some_table where id=$1
Có cách nào để nhận/có giá trị/thông số này không?
Edited (ví dụ bổ sung):
--table for saving query
create table log_table (
query text
)
--table for trigger
create table some_table (
id text
)
--function itself
CREATE FUNCTION save_query() RETURNS trigger AS $$
switch $TG_op {
DELETE {
spi_exec "INSERT INTO log_table (query) VALUES (current_query())"
}
default {
return OK
}
}
return OK
$$ LANGUAGE pltcl;
Tạo một trigger:
create trigger test_trigger before delete on some_table for each row execute procedure save_query();
tuyên bố đã chuẩn bị được thực hiện từ hibernate.
Sửa lại (java phần bổ sung)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class DeleteUsingPreparedStmt {
public static void main(String[] args) {
try {
String deleteString = "delete from floors where id = ? ";
final int idToDelte = 1;
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://127.0.0.1:5432/YOUR_DATABASE";
Connection conn = DriverManager.getConnection(url, "user", "password");
PreparedStatement deleteStmt = conn.prepareStatement(deleteString);
deleteStmt.setInt(1, idToDelte);
deleteStmt.executeUpdate();
} catch (Exception e) {
//hide me :)
}
}
}
Bạn cần một trình điều khiển JDBC - click.
Ông có thể viết ra mã ví dụ cho điều này trong câu hỏi của bạn? –
Câu hỏi đã chỉnh sửa. Tôi đơn giản hóa mã một chút, nhưng nó hoạt động theo cách tương tự. –