В процедуре PL/SQL вызывается java класс, в котором обрабатывается структура каталогов на сервере. И результат тестирования показал проблему при наличие в именах каталогов или файлов русской буквы "И", которая заменяется на "?".
Подробности - на сервере Linux c UTF-8, а в Oracle NLS_LANG c MS-1251.
Несмотря на массу материалов :
http://www.javaportal.ru/java/articles/ruschars/ruschars.html
http://www.skipy.ru/technics/encodings.html
Решение совершенно простое, поэтому в прямую о нем не написано, но это и так понятно. Необходимо в java классе не пользоваться перекодировкой, а необходимо рассказать подробности :
System.setProperty("file.encoding", "UTF-8");
File directory = new File(directoryName);
File[] filesInDir = directory.listFiles();
String fileName;
if (filesInDir != null) {
int length = filesInDir.length;
for (int i = 0; i < length; ++i) {
File f = filesInDir[i];
fileName = f.getName();
//этот код после setProperty("file.encoding", "UTF-8") не нужен String fN = new String(fileName.getBytes("windows-1251"), "UTF8");
if (f.isFile()) {
#sql { INSERT INTO DIR_LIST (FILENAME,ISFILE) VALUES (:fileName,1) };
} else {
#sql { INSERT INTO DIR_LIST (FILENAME,ISFILE) VALUES (:fileName,0) };
}
}
}
Все дело в System.setProperty("file.encoding", "UTF-8").
Если при выполнении этого оператора получите ругательство про нехватку прав - ORA-29532: вызов Java прерван неустановленным исключением Java: java.security.AccessControlException: the Permission (java.util.PropertyPermission file.encoding write) has not been granted to ADM, тогда выполните :
The PL/SQL to grant this is dbms_java.grant_permission( 'ADM', 'SYS:java.util.PropertyPermission', 'file.encoding', 'write' ).
|