java - PSQLException:错误:语法错误在“$ 1”或附近[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我在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)
postgresql jdbc prepared-statement
2个回答
3
投票

标识符(例如表名和列名)不能与占位符一起使用,因此您必须使用字符串操作,并且仅使用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正在将?占位符内部转换为编号占位符。


-1
投票

试试这个

statement = conn.prepareStatement("insert into " + schemaName + ".? (?) values(?)");
statement.setString(1, tableName);
statement.setString(2, columnName);
statement.setString(3, columnValue);
statement.executeUpdate();
conn.commit();
© www.soinside.com 2019 - 2024. All rights reserved.