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;";
当使用 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;";