我正在创建一个简单的java应用程序,它使用我已经创建的postgresql数据库(数据库已创建,而不是应用程序)。 其中一张表称为“员工”。 它有一个名为“eid”的属性,是员工 ID 的缩写。
我正在尝试使用PreparedStatement 来概括数据库SELECT 查询。我希望有两个通用参数。我还想获取结果的长度,因此我创建了第二个PreparedStatement 来查找它。
代码看起来很简单,但我不断收到相同的语法错误。
这是我尝试运行的代码:
public static String[] select(Connection conn, String arguments) {
try {
PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM ?");
PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM ?");
String[] arrOfStr = arguments.split(" ", 0);
System.out.println(arrOfStr[0].equals("eid"));
System.out.println(arrOfStr[1].equals("Employee"));
preparedSelect.setString(1, arrOfStr[0]);
preparedSelect.setString(2, arrOfStr[1]);
preparedCount.setString(1, arrOfStr[1]);
ResultSet rsSelect = preparedSelect.executeQuery();
ResultSet rsCount = preparedCount.executeQuery();
...
在第一行的参数中,我希望 SELECT 查询为:“SELECT eid FROM Employee”。 在第二行的参数中,我希望 SELECT 查询为:“SELECT COUNT(*) FROM Employee”。
使用此应用程序的用户输入(在程序的前面)在“select”函数的参数中找到的“arguments”参数。 “arrOfStr”字符串数组将包含这两个字符串“eid”和“Employee”。
为了检查“arrOfStr”是否具有正确的值,我打印了 .equals() 函数将这些值与我想要的字符串进行比较而得到的 boolean 值,这些字符串同样是“eid”和“Employee”。
在控制台中,结果是,并不令我惊讶:
true
true
因此,在接下来的 3 行中,我将字符串值“eid”和“Employee”设置到PreparedStatements 中。
最后,我执行以下两行中的查询。这两个查询执行(我尝试过切换它们)都给了我一个非常相似的错误。对于给定的代码,我收到错误:
SQL State: 42601
ERROR: syntax error at or near "$2"
Position: 16
这表明字符串“Employee”的语法存在问题。
当我直接进入我的 postgresql 数据库并输入:
SELECT eid FROM Employee;
我得到输出:
1663
1983
1357
...
有人可以解释一下这个语法错误吗?
最佳答案
正如 Elliott 所提到的,您不能以这种方式绑定(bind)表名称。
要实现您的目标,请尝试以下操作:
String[] arrOfStr = arguments.split(" ", 0);
PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM " + arrOfStr[1]);
PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM " + arrOfStr[1]);
关于java - 双参数PreparedStatement 抛出语法错误,SQL 状态 42601,靠近第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61133721/