Я использую JDBC PreparedStatement для запроса базы данных Teradata из веб-службы. В моей таблице есть столбец PHONE_NUMBER, который хранится как VARCHAR (10). Я всегда использовал PreparedStatement setString()
поставить параметр для этого столбца, как показано ниже:Teradata JDBC не распознает параметр PreparedStatement как VARCHAR без кавычек
String myPhoneNumber = "5551234567";
String sql = "SELECT * FROM MYTABLE " +
"WHERE PHONE_NUMBER = ? ";
PreparedStatement p_stmt = db.getPreparedStatement(sql);
p_stmt.setString(1, myPhoneNumber);
ResultSet rs = db.executeQuery(p_stmt);
возвращает правильные результаты, но я заметил, что процессор Teradata использует для этого запроса достаточно высок. Согласно плану EXPLAIN, похоже, что Teradata интерпретирует параметр myPhoneNumber
как FLOAT, а не VARCHAR, и поэтому он должен сделать преобразование данных, чтобы сравнить его с столбцом VARCHAR PHONE_NUMBER
. Вот выдержка из EXPLAIN плана:
...
MYDATABASE.MYTABLE.PHONE_NUMBER (FLOAT, FORMAT
'-9.99999999999999E-999'))= 5.55123456700000E 009)
Итак, я пришел с ниже, которые показали значительное улучшение использования процессора (улучшение 99,86%):
String myPhoneNumber = "5551234567";
String sql = "SELECT * FROM MYTABLE " +
"WHERE PHONE_NUMBER = ''||?||'' ";
PreparedStatement p_stmt = db.getPreparedStatement(sql);
p_stmt.setString(1, myPhoneNumber);
ResultSet rs = db.executeQuery(p_stmt);
Так что мой вопрос почему это необходимо? Должно ли setString
сообщить JDBC, чтобы сказать Teradata ожидать параметр String/VARCHAR?
Спасибо!
Это, безусловно, кажется странным. – Kayaman
SetString не добавляет кавычки вокруг ваших параметров. Подумайте об этом с точки зрения concatentation. Если вы concat 'select * from ... where phone_number =' и myPhoneNumber, вы получите 'where phone_number = 5551234567'. Это именно то, что вы просили. Вместо того, чтобы терпеть неудачу, Teradata молча делает (очень дорогой) неявный бросок. – Andrew
@Andrew Не должно * иметь * to. Независимо от формата бинарного файла в Интернете, он должен быть сконструирован в соответствии с установленным типом параметра. Цитаты для удобства чтения, база данных им не нужна. – Kayaman