簡體   English   中英

如果已存在,則PreparedStatement拋出:org.postgresql.util.PSQLException:列索引超出范圍:1,列數:0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM