java - PSQLException:错误:“$ 1”处或附近的语法错误[重复]
Posted
技术标签:
【中文标题】java - PSQLException:错误:“$ 1”处或附近的语法错误[重复]【英文标题】:java - PSQLException: ERROR: syntax error at or near "$1" [duplicate] 【发布时间】:2017-12-30 02:50:30 【问题描述】:我是否在 PreparedStatement 中使用了错误的语法?
执行时:
1 statement = conn.prepareStatement("insert into ?.? (?) values(?)");
2 statement.setString(1, schemaName);
3 statement.setString(2, tableName);
4 statement.setString(3, columnName);
5 statement.setString(4, columnValue);
6 statement.executeUpdate();
7 conn.commit();
抛出的异常:
org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
Position: 13
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2477)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2190)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:300)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169)
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:136)
at PostgreSQLDatabase.updateTable(MyClass.java:6)
【问题讨论】:
【参考方案1】:标识符(例如表名和列名)不能与占位符一起使用,因此您必须改用字符串操作,并且只能为 values(?)
使用占位符:
statement = conn.prepareStatement("insert into " + schemaName + "." + tableName + " (" + columnName + ") values(?)");
statement.setString(1, columnValue);
这假设您选择了schemaName
、tableName
和columnName
,这样它们就不会区分大小写或包含空格或类似的异常。如果标识符区分大小写或包含空格等,那么您需要在 SQL 中将它们双引号:
"insert into \"" + schemaName + "\".\"" + ...
如果标识符也可以包含双引号,那么在将它们放入 SQL 之前,您必须将它们加倍。
错误涉及$1
,因为 PostgreSQL 本身使用编号占位符($1
、$2
、...),而 JDBC 正在内部将 ?
占位符转换为编号占位符。
【讨论】:
【参考方案2】:试试这个
statement = conn.prepareStatement("insert into " + schemaName + ".? (?) values(?)");
statement.setString(1, tableName);
statement.setString(2, columnName);
statement.setString(3, columnValue);
statement.executeUpdate();
conn.commit();
【讨论】:
您不能参数化对象名称,只能参数化值。以上是关于java - PSQLException:错误:“$ 1”处或附近的语法错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章
org.postgresql.util.PSQLException:错误:对于类型字符变化的值太长(255)
PSQLException:错误:tsquery 中的语法错误
org.postgresql.util.PSQLException:错误:关系不存在 PreparedStatement.executeQuery ()