首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PreparedStatement IF EXISTS引发异常: org.postgresql.util.PSQLException:列索引超出范围: 1,列数:0

PreparedStatement IF EXISTS引发异常: org.postgresql.util.PSQLException:列索引超出范围: 1,列数:0
EN

Stack Overflow用户
提问于 2017-11-16 00:36:46
回答 1查看 226关注 0票数 1

以下代码抛出异常:

代码语言:javascript
运行
复制
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改成这样,那就没问题了:

代码语言:javascript
运行
复制
String sql = "UPDATE myTable SET \"myColumn\"=? WHERE \"id\"=1;";

我做错了什么?我只想更新一些列,如果它们存在的话...

EN

Stack Overflow用户

发布于 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

所以看起来你不能准备匿名代码块,我猜你的代码:

代码语言:javascript
运行
复制
PreparedStatement pstmt = c.prepareStatement(sql)

不做任何准备。您可以通过发出sql请求来查看:

代码语言:javascript
运行
复制
select * from pg_prepared_statements;

如果您像这样更改代码:

代码语言:javascript
运行
复制
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错误。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47312743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档