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
,因为我的查询包含“?”
参数