Некоторые технологии, которые выполняют параметризованные операторы SQL, допускают параметры в определенных точках в операторе SQL ONLY .
Например, DB2 не позволяет параметрам ограничивать возвращаемые строки: пока этоПараметризованный оператор JDBC действителен:
select * from t where status = ? order by amount fetch first 10 rows only
... это не так:
select * from t where status = ? order by amount fetch first ? rows only
Я предполагаю, что вы сталкиваетесь с аналогичным ограничением двигателя или драйвера.
Лучший обходной путь, который я нашел на данный момент, - это вставка проблемных параметров в виде строки, конкатенация ее с оператором SQL.Например, в Java вы можете сделать:
// parameters
int status = 3;
int maxRows = 10;
// execution
PreparedStatement ps = conn.prepareStatement(
"select * from t where status = ? order by amount fetch first "
+ maxRows
+ " rows only"
);
ps.setInt(1, status);
ResultSet rs = ps.executeQuery();
Оба параметра используются, но по-разному:
status
включен в качестве традиционного параметра JDBC. maxRows
вводится как простая строка (SQL Injection).
В вашем случае вы можете использовать вторую стратегию для параметра continuousexcessivehours
.
Многие ORM предлагают решения для достижения этой цели.Например, MyBatis предлагает #{status}
для первого случая и ${maxRows}
для второго.Вы заметили разницу?
Наконец, последний совет: будьте осторожны с SQL-инъекцией.Выполняйте ввод строки только для параметра, если вы уверены, что знаете происхождение его значения, а оно не из неизвестного источника.