![](/img/trans.png)
[英]org.postgresql.util.PSQLException: The column index is out of range: 2, number of columns: 1
[英]PreparedStatement IF EXISTS throws: org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0
以下代碼引發異常:
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;";
我究竟做錯了什么? 我只想更新一些存在的列...
Postgres文檔說:
PREPARE名稱[(data_type [,...])] AS語句
...
聲明
Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.
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錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.