我的应用程序有无数的查询,我想得到其中一些的执行计划。大多数如果不是 所有的查询都有多个参数,我找不到如何在 PostgreSQL 中获取任何非平凡查询的执行计划。
真实的案例要复杂得多,但这里有一个简单的、有代表性的查询案例(为简单起见,只有一个参数):
Connection conn = DriverManager.getConnection("...", "...", "...");
PreparedStatement ps1 = conn.prepareStatement(
"prepare x as select * from documents where content = $1");
ps1.execute();
PreparedStatement ps2 = conn.prepareStatement(
"explain (format json) execute x (?)");
ps2.setString(1, "long content here...");
ResultSet rs = ps2.executeQuery(); // Error here!
while (rs.next()) {
System.out.println(rs.getString(1));
}
当我运行它时,出现错误:
错误:没有参数 $1 位置:34
如果我将
$1
替换为 'a'
一切正常,我得到了结果。但是,如果我尝试使用一个参数,如果不起作用。
我试过了 使用
null
而不是 ?
并且它不会崩溃,但它会返回一个错误的执行计划;似乎它以某种方式使逻辑短路并返回完全脱离现实的东西。
我做错了什么?