當使用QUERY_BAND和引數化的PreparedStatement時,我得到了這樣的例外:
。
java.sql.SQLException: [Teradata資料庫] [TeraJDBC 16.20.00.04] [Error 5992] [SQLState HY000] 在QUERY_BAND中發現一個語法錯誤。
我的代碼 :
String queryBand = "Set QUERY_BAND = ? UPDATE FOR SESSION VOLATILE;"。
try {
dbConnection = baseJDBCTemplate.getDataSource().getConnection()。
//在Query Band中設定用戶名稱。
try (PreparedStatement stmt = dbConnection.pareStatement(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 Boot 1.5.8
uj5u.com熱心網友回復:
由于你使用的是JdbcTemplate,所以你用錯了,而且很危險,因為這泄漏了一個連接,當執行足夠多的次數時,它將使你的應用程式陷入停頓。
以正確的方式使用JdbcTemplate。
jdbcTemplate.execute(queryBand, (ps) -> {
ps.setString(1, "USER=x256") 。
return ps.execute()。
});
這將執行你的查詢,并回傳一個boolean,如果它成功或不成功。當然,如果你不需要的話,你可以忽略它。
有了這個,你就正確地利用了JdbcTemplate.
uj5u.com熱心網友回復:
最后我在這個檔案中找到了回應 https://docs.teradata.com/r/rgAb27O_xRmMVc_aQq2VGw/oXcSulxgPuaDnG0qMLYYrg
SESSION 不支持 ? 引數,只支持 TRANSACTION。
String queryBand = "Set QUERY_BAND=? UPDATE FOR SESSION VOLATILE;"; //不接受。
String queryBand = "Set QUERY_Band=? UPDATE FOR TRANSACTION;"; //accepetd。
所以在我的情況下(更新會話),我不能使用? 引數,所以我使用這個(即使我有sonar安全警報):
String queryBand = "SET QUERY_BAND='USER="/span> StringEscapeUtils. escapeSql(rtfeId) "; ' UPDATE FOR SESSION VOLATILE;"。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/324196.html
標籤:
下一篇:活線發射未被觸發
