首页 > 解决方案 > 2 参数 PreparedStatement 抛出语法错误,SQL 状态 42601,靠近第二个参数

问题描述

我正在创建一个简单的 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() 函数产生的布尔值,将值与我想要的字符串进行比较,这些字符串又是“eid”和“Employee”。

在控制台中,结果出乎我的意料:

true
true

因此,在接下来的 3 行中,我将字符串值“eid”和“Employee”设置到 PreparedStatements 中。

最后,我在以下 2 行中执行查询。这两个查询执行(我尝试过切换它们)都给我一个非常相似的错误。对于给定的代码,我收到错误:

SQL State: 42601
ERROR: syntax error at or near "$2"
  Position: 16

这说明字符串“Employee”的语法存在问题。

当我直接进入我的 postgresql 数据库并输入:

SELECT eid FROM Employee;

我得到输出:

1663
1983
1357
...

有人可以解释这个语法错误吗?

标签: javasqlpostgresqljdbc

解决方案


正如 Elliott 所提到的,您不能以这种方式绑定表名。

为了实现你的目标,试试这个:

String[] arrOfStr = arguments.split(" ", 0);

PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM " + arrOfStr[1]);
PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM " + arrOfStr[1]);

推荐阅读