Я хочу изменить параметры NLS_SORT и NLS_COMP для каждого запроса к этой конкретной схеме, но есть и другие пользователи в этой системе, которые также хотят сохранить исходные значения, поэтому использование ALTER SYSTEM SET в этом нет, нет дело. Я также не хочу менять каждый запрос на эту конкретную схему.
Есть ли способ поместить эти значения в файл инициализации, относящийся только к этой схеме, или я могу каким-то образом добавить триггер, который устанавливает эти значения в сеансе всякий раз, когда сеанс запускается в этой схеме?
Я использую Oracle Express 11G R2, и решение не требует обратной совместимости.
Моя цель состоит в том, чтобы не запускать строки ALTER SESSION SET перед выполнением оператора SELECT-LIKE и заставить его давать два результата, а не один. Вот пример кода Java, который я использовал, чтобы проверить, какие значения я действительно хочу, чтобы значения NLS_COMP и NLS_SORT имели:
public class OracleCaseTest {
public static void main(String[] args) throws SQLException {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("CASETEST");
dataSource.setPassword("casetest");
Connection conn = null;
PreparedStatement createStatement = null;
PreparedStatement populateStatement = null;
PreparedStatement comparisonAlterSessionStatement = null;
PreparedStatement sortAlterSessionStatement = null;
PreparedStatement queryStatement = null;
PreparedStatement deleteStatement = null;
ResultSet rs = null;
conn = dataSource.getConnection();
createStatement = conn
.prepareStatement("CREATE TABLE CollationTestTable ( Name varchar(255) )");
createStatement.execute();
try {
// comparisonAlterSessionStatement = conn
// .prepareStatement("ALTER SESSION SET NLS_COMP=LINGUISTIC");
// comparisonAlterSessionStatement.execute();
//
// sortAlterSessionStatement = conn.prepareStatement("ALTER SESSION SET NLS_SORT=BINARY_CI");
// sortAlterSessionStatement.execute();
String[] names = { "pepe", "pépé", "PEPE", "MEME", "mémé", "meme" };
for (String name : names) {
populateStatement = conn
.prepareStatement("INSERT INTO CollationTestTable VALUES (?)");
populateStatement.setString(1, name);
populateStatement.execute();
}
queryStatement = conn
.prepareStatement("SELECT Name FROM CollationTestTable WHERE NAME LIKE 'pe%'");
rs = queryStatement.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
} finally {
deleteStatement = conn.prepareStatement("DROP TABLE CollationTestTable");
deleteStatement.execute();
}
}
}
Мне известна проблема с полным сканированием таблиц без лингвистических индексов, которую это может создать, но проигнорируйте ее для этого вопроса.
ОБНОВЛЕНИЕ: Это заявление, которое я использовал для создания своего триггера из интерфейса командной строки SQL (после подключения и входа в систему с моим пользователем):
create or replace trigger nls_settings
after logon on schema
begin
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI';
end nls_settings;
/
Также изменил исходный вопрос, чтобы указать, что под «базой данных» в мире Oracle я действительно имел в виду «схема» / «пользователь».