Подготовленные Java параметры оператора для запроса сеанса oracle alter
Я попытался выполнить запрос сеанса oracle alter для изменения языковых настроек, но он завершился неудачно с ошибкой "ORA-01036: недопустимое имя / номер переменной".
preparedStatement = connection.prepareStatement("ALTER SESSION SET NLS_SORT = ?");
preparedStatement.setString(1, "BINARY_CI");
preparedStatement.execute();
Oracle не позволяет связывать переменные в выражениях ddl. Поскольку переменные связывания имеют выигрыш в производительности (в моем случае использования этот запрос на изменение сеанса будет выполняться при каждом подключении, используемом в веб-приложении), и это также предотвращает внедрение приложения SQL, я хотел их использовать. Если нет переменных связывания, есть ли другой оптимизированный способ выполнения вышеупомянутого запроса изменения сеанса?
2 ответа
Переменные связывания имеют выигрыш в производительности, потому что анализ / оптимизация запросов выполняется только один раз, а не при каждом выполнении.
Там нет никакого анализа, сделанного на этом alter session
call, использование переменной bind здесь не принесет вам ничего с точки зрения производительности.
Что касается SQL-инъекции, просто проверьте имя сопоставления по списку поддерживаемых сопоставлений.
ALTER SESSION
не требует плана запроса (который строится медленно), поэтому он должен быть быстро выполнен, даже не подготовлен.
Если вы используете какую-либо форму пула соединений (и вы, вероятно, делаете), этот оператор должен выполняться еще реже.
Используйте жестко закодированную буквенную форму или сравните имя сопоставления со списком известных сопоставлений.