java - 双参数PreparedStatement 抛出语法错误,SQL 状态 42601,靠近第二个参数

标签 java sql postgresql jdbc

我正在创建一个简单的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/

相关文章:

postgresql - 检查值是否不等于选择查询时触发函数总是引发异常

java - sql异常:Parameter index out of range

当使用 <> 时,MySQL Select 响应缺失带有 NULL 值的行

java - 如何将以下代码转换为流

java - 无法引用迭代器中以前使用过的元素(java)

php - 使用日期MySQL触发器自动删除数据

sql - Django 自定义 SQL 返回 QuerySet,其中每个对象都有附加属性

postgresql - 如何使用 Postgraphile 或替代方案在 Postgres 中实现复杂的基于权限的数据访问

java - 每行列数不同的 JTable

java - 如何关闭 SonarQube 4 中的代码覆盖率?