我正在处理一个 Oracle 10g 数据库,并提供了以下存储过程:
procedure get_synopsis (
p_id in my_schema.products.p_id%type,
p_synopses out sys_refcursor); -- cursor of - synopsis_type, synopsis_text
在我的 Java 代码中,我以这种方式准备语句:
String idForDb = fromIdUrlToIdDb(prodIdUrl);
statement.registerOutParameter(1, OracleTypes.VARCHAR);
statement.setString(1, idForDb );
statement.registerOutParameter(2, OracleTypes.CURSOR);
我通过这种方式获得了我需要的数据:
String defaultSyn, nonDefSyn;
String returnedId = ((OracleCallableStatement)stm).getString(1);
try ( ResultSet synopses = ((OracleCallableStatement)stm).getCursor(2) ){ // p_synopses - cursor of: synopsis_type, synopsis_text
while( synopses!=null && synopses.next() ){
String type = synopses.getString(1) != null ? synopses.getString(1).toUpperCase() : null;
if( type != null ){
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader( synopses.getClob(2).getCharacterStream() );
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
if("DEFAULT".equals(type)){
defaultSyn = sb.toString();
}else if("NONDEFAULT".equals(type)){
nonDefSyn = sb.toString();
}
// ...
}
}
}
SYNOPSIS_TEXT 字段是NCLOB,但我使用字符串作为其内容,因为我确定它不会超过 MAX_INTEGER。使用的“国家字符集”是Unicode。
在从该字符串生成的 JSON 中,我可以看到正确处理的字符,如逗号、连字符、破折号、单引号、点、括号、冒号等,但我遇到了左单引号/ U+2018 ( ' ' )等特殊字符的问题, 显示不正确。我还可以在文本中看到换行符( \n )和引号( \" )。
以这种格式向消费者返回文本是否正确,或者我应该更好/不同地处理它?