Teradata JDBC 中 QUERY_BAND 的参数化 PreparedStatement

Parameterized PreparedStatement for QUERY_BAND in Teradata JDBC

当使用 QUERY_BAND 和参数化的 PreparedStatement 时,我遇到了这个异常:

java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.04] [Error 5992] [SQLState HY000] A syntax error was found in the QUERY_BAND.

我的代码:

 String queryBand = "SET QUERY_BAND = ? UPDATE FOR SESSION VOLATILE;";
 try {
 dbConnection = baseJDBCTemplate.getDataSource().getConnection();
        //set user name in the Query Band
        try (PreparedStatement stmt = dbConnection.prepareStatement(queryBand)) {
            stmt.setString(1, "USER=x256;");//"+rtId+"
            stmt.execute(queryBand);
        }
 catch (SQLException e) {
        throw new SIRRestitGeneratorException("DB Exception ",e);
 } 

我在 Teradata 文档中做了同样的事情 https://docs.teradata.com/r/eWpPpcMoLGQcZEoyt5AjEg/RH2BOZYzHp6u4dhsrWbRlw

我正在使用 Teradata 版本 16.20.00.04 Spring 启动 1.5.8

当您使用 JdbcTemplate 时,您用错了它,而且很危险,因为这会泄漏连接,当执行足够多的时候,它会使您的应用程序陷入停顿。

正确使用JdbcTemplate

jdbcTemplate.execute(queryBand, (ps) -> {
  ps.setString(1, "USER=x256");
  return ps.execute();
});

这应该执行您的查询,并且 return 一个 boolean 是否成功。如果不需要,当然可以忽略。

有了这个,您就可以正确地利用 JdbcTemplate

我终于在这个文档中找到了答案 https://docs.teradata.com/r/rgAb27O_xRmMVc_aQq2VGw/oXcSulxgPuaDnG0qMLYYrg

那个? SESSION 不支持参数,仅 TRANSACTION 支持该参数。

String queryBand = "SET QUERY_BAND=? UPDATE FOR SESSION VOLATILE;"; // not accepted

String queryBand = "SET QUERY_BAND=? UPDATE FOR TRANSACTION;"; // accepetd

所以就我而言(更新会话),我不能使用 ?参数,所以我使用这个(即使我有声纳安全警报):

String queryBand = "SET QUERY_BAND='USER="+StringEscapeUtils.escapeSql(rtfeId)+";' UPDATE FOR SESSION VOLATILE;";