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);

这假设您选择了schemaNametableNamecolumnName,这样它们就不会区分大小写或包含空格或类似的异常。如果标识符区分大小写或包含空格等,那么您需要在 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)

Heroku 上的 PSQLException

PSQLException:错误:tsquery 中的语法错误

PSQLException:错误:在或附近出现语法错误

PSQLException:错误:关系“表”不存在

org.postgresql.util.PSQLException:错误:关系不存在 PreparedStatement.executeQuery ()