【问题标题】:Parameterized PreparedStatement for QUERY_BAND in Teradata JDBCTeradata JDBC 中 QUERY_BAND 的参数化 PreparedStatement
【发布时间】:2021-11-12 10:36:42
【问题描述】:

当使用带有参数化 PreparedStatement 的 QUERY_BAND 时,我得到了这个异常:

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);
 } 

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

我正在使用 Teradata 版本 16.20.00.04 Spring Boot 1.5.8

【问题讨论】:

  • 不要...只需使用 JdbcTemplate 您已经必须执行代码。您的代码存在缺陷,因为它泄漏了连接。只需执行jdbcTemplate.update 即可执行查询。
  • 感谢您的回复,但我在执行行之前尝试 (PreparedStatement stmt = dbConnection.prepareStatement(queryBand)) { 在此行中遇到异常
  • 不管你仍然应该使用 jdbcTemplate 而不是你现在使用它的方式。执行baseJdbcTemplate.update(queryBand, "USER=x256"); 之类的操作。不多不少,抛弃一切。
  • 我遇到了同样的问题 [Teradata Database] [TeraJDBC 16.20.00.04] [错误 5992] [SQLState HY000] 在 QUERY_BAND 中发现语法错误。
  • UPDATE FOR SESSION VOLATILE 有效吗?

标签: java spring teradata jdbctemplate


【解决方案1】:

当您使用 JdbcTemplate 时,您使用错了,而且很危险,因为这会泄漏连接,当执行足够多的时间时,它会将您的应用程序搁置。

正确使用JdbcTemplate

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

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

这样您就可以正确使用JdbcTemplate

【讨论】:

【解决方案2】:

最后我在这个文档中找到了回复 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;";

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2023-04-04
  • 2017-04-15
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2011-12-02
  • 2017-11-21
相关资源
最近更新 更多