sqlserver向oracle移植注意事项
1、检查sqlmap中select语句如果resultClass="java.util.HashMap",则在oracle版的sqlmap语句中
select出来的字段需要用as "字段名xxx" 指定一下字段的别名,因为oracle默认查询结果中各字段名变成大写了,
如果要与sqlsever版保持一致,需要用as把字段别名指定一下。
2、检测表名后的别名是否用as指定,如果有把as去掉
3、检查sqlmap中where 条件中是否有xx='',改成xx is null
4、检查sqlmap中是否有isnull()函数改成nvl()函数
5、检查sqlmap中是否有top,有的话用rownum改造
6、检查sqlmap中是否有substring,如果有用substr替换。
7、检查sqlmap中是否使用+做连接符号,如果有用||替换
8、移植时,字段类型sqlserver中text对应oracle的clob,sqlserver中的image类型对应oracle的blob
java程序处理text或clob类型类似如下
Object extGroupObj = ((HashMap)list.get(i)).get("extDefcode");
extGrpStr = extGroupObj.toString();
if(extGroupObj instanceof oracle.sql.CLOB){
try{
Reader reader=((oracle.sql.CLOB)clobData).getCharacterStream();
BufferedReader br=new BufferedReader(reader,8192);
char[] cbuf= new char[8192];
int j=0;
StringBuffer bf = new StringBuffer();
while((j=br.read(cbuf))!=-1)
{
bf.append(cbuf,0,j);
}
retStr=bf.toString();
}catch(Exception ex){
//logger.error("读取clob数据发生异常",ex);
}
}
如果是image或blob,类似如下处理
Object byteTmp= info.get("ruleGroupCert");
byte[] byteCode = null;
if(byteTmp instanceof oracle.sql.BLOB ){
byte[] byteCode = null;
InputStream in =null;
try{
oracle.sql.BLOB blobtmp = (oracle.sql.BLOB) byteTmp;
in = blobtmp.getBinaryStream();
int bsize = blobtmp.getBufferSize();
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] bufbyte = new byte[bsize];
//in.read(byteCode);
int len = 0;
while ((len = in.read(bufbyte)) != -1) {
os.write(bufbyte, 0, len);
}
byteCode=os.toByteArray();
}catch(Exception ex){
logger.error("读取属性证书blob字段出错",ex);
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}else{
byteCode= (byte[])byteTmp;
}