Java PreparedStatement(如果存在)抛出:org.postgresql.util.PSQLException:列索引超出范围:1,列数:0

Java PreparedStatement(如果存在)抛出:org.postgresql.util.PSQLException:列索引超出范围:1,列数:0,java,postgresql,prepared-statement,postgresql-9.6,Java,Postgresql,Prepared Statement,Postgresql 9.6,以下代码引发异常: 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

以下代码引发异常:

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();
我做错了什么?我只想在某些列存在时更新它们…

Postgres docs说:

将名称[(数据类型[,…])]准备为语句

声明

Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.

因此,您似乎无法准备匿名代码块,我猜您的代码:

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();
String sql=“DO$$which$$;”;
连接c=DriverManager.getConnection(…);
PreparedStatement pstmt=c.prepareStatement(sql);
((org.postgresql.PGStatement)pstmt.setPrepareThreshold(1);// 博士后说:

将名称[(数据类型[,…])]准备为语句

声明

Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.

因此,您似乎无法准备匿名代码块,我猜您的代码:

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();
String sql=“DO$$which$$;”;
连接c=DriverManager.getConnection(…);
PreparedStatement pstmt=c.prepareStatement(sql);

((org.postgresql.PGStatement)pstmt.setPrepareThreshold(1);//您是否对信息\u schema.COLUMNS具有select访问权限?为什么不在不使用PL/pgSQL块的情况下运行
UPDATE
,并捕获由此产生的任何异常?或者在单独的JDBC调用中运行
if-exists
,并在Java内部执行
if
?@MichaelPeacock yes Ido@a_horse_with_no_name我需要更新50000列,这样性能会非常差。如果存在50000列,为什么需要检查它们?这听起来像是一个糟糕的设计。你有信息的select访问权吗?你为什么不在没有PL/pgSQL块的情况下运行
UPDATE
,并捕获由此产生的任何异常?或者在单独的JDBC调用中运行
if-exists
,并在Java内部执行
if
?@MichaelPeacock yes Ido@a_horse_with_no_name我需要更新50000列,这样性能会非常差。如果存在50000列,为什么需要检查它们?这听起来像是一个糟糕的设计。我不能评论
pstmt.setString
,因为我的查询包含
“?”
参数。我不能评论
pstmt.setString
,因为我的查询包含
“?”
参数