PostgreSQL异常:语法错误

时间:2018-01-19 08:13:05

标签: java sql postgresql

我尝试将PostgreSQL与java代码一起使用以创建Web服务,但我仍然遇到同样的错误:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "CA8E6"
    Position : 84

以下是调用查询的函数:

public ArrayList<Position> TrajectoireH(String icao, String date_deb, String date_fin)  {
    query = "SELECT reception_date,longitude,latitude"
            + " FROM adsb_message"
            + " WHERE mode_s_icao_id = " + icao
            + " AND reception_date > " + date_deb
            + " AND reception_date < " + date_fin;
    System.out.println(query);

    Avion av = new Avion(icao);

    Statement state;
    try {
        state = PostgreSQLConnection.getConnection().createStatement();
        ResultSet result = state.executeQuery(query);

        while(result.next()) {
            float lat,lon;
            String date;
            lat = result.getFloat("latitude");
            lon = result.getFloat("longitude");
            date = result.getString("reception_date");

            Position pos = new Position(lat,lon,date);
            av.ajoutPos(pos);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

    //ResultSetMetaData resultMeta = result.getMetaData();


    return av.getTrajectoireH();
}

为了进行测试,我选择了ICAO&#34; 4CA8E6&#34;。似乎该计划在第一个角色停止阅读国际民航组织。打印查询返回:

SELECT reception_date,longitude,latitude FROM adsb_message 
    WHERE mode_s_icao_id = 4CA8E6 
        AND reception_date > 2000-01-01 00:00:00.0
        AND reception_date < 3000-01-01 00:00:00.0

这对我来说似乎是正确的。你知道语法错误可能来自哪里吗?

2 个答案:

答案 0 :(得分:2)

错误的直接原因很明显,因为原始查询中包含未转义的字符串和日期文字。最好的解决方法是使用预准备语句,如下所示。请注意,我将变量date_febdate_fin绑定为字符串,实际上最佳实践是绑定某种兼容的Java日期类型(例如java.util.Date或者Java 8中的某些内容API)。如果您的数据库接受它,绑定字符串文字可能会起作用。我没有纠正这个问题,因为很可能你的Java代码中已经有了日期变量,你只需要开始使用它们。

String query = "SELECT reception_date,longitude,latitude"
             + " FROM adsb_message"
             + " WHERE mode_s_icao_id = ?"
             + " AND reception_date > ?"
             + " AND reception_date < ?";
PreparedStatement ps = PostgreSQLConnection.getConnection().prepareStatement(query);
ps.setString(1, icao);
ps.setString(2, date_feb);
ps.setString(3, date_fin);
ResultSet result = ps.executeQuery();

while (result.next()) {
    float lat, lon;
    String date;
    lat = result.getFloat("latitude");
    lon = result.getFloat("longitude");
    date = result.getString("reception_date");

    Position pos = new Position(lat,lon,date);
    av.ajoutPos(pos);
}

答案 1 :(得分:-2)

from subprocess import run, PIPE

result = run(cmd, stdout=PIPE, stderr=PIPE)
print(result.stdout)
print(result.stderr)