以下代码抛出异常:
String sql = "DO $$ " +
"BEGIN " +
"IF EXISTS ( SELECT column_name FROM information_schema.COLUMNS WHERE table_name='myTable' AND column_name='myColumn') THEN " +
"UPDATE myTable SET \"myColumn\"=? WHERE \"id\"=1; " +
"END IF; " +
"END " +
"$$; ";
Connection c = DriverManager.getConnection(...);
PreparedStatement pstmt = c.prepareStatement(sql)
pstmt.setString(1, "bla bla"); // <--- EXCEPTION HERE
pstmt.executeUpdate();如果我把sql改成这样,那就没问题了:
String sql = "UPDATE myTable SET \"myColumn\"=? WHERE \"id\"=1;";我做错了什么?我只想更新一些列,如果它们存在的话...
发布于 2017-11-16 01:54:15
Postgres docs说:
准备名称[( data_type,... )] AS语句
..。
语句
任何SELECT、INSERT、UPDATE、DELETE或VALUES语句。
https://www.postgresql.org/docs/9.6/static/sql-prepare.html
所以看起来你不能准备匿名代码块,我猜你的代码:
PreparedStatement pstmt = c.prepareStatement(sql)不做任何准备。您可以通过发出sql请求来查看:
select * from pg_prepared_statements;如果您像这样更改代码:
String sql = "DO $$ whatever $$;";
Connection c = DriverManager.getConnection(...);
PreparedStatement pstmt = c.prepareStatement(sql);
((org.postgresql.PGStatement)pstmt).setPrepareThreshold(1); // <-- Add this line
// pstmt.setString(1, "bla bla"); // comment it out
pstmt.executeUpdate();您会得到有关要准备的错误语句的实际postgres错误。
https://stackoverflow.com/questions/47312743
复制相似问题