JDBC操控Oracle XMLDB
現(xiàn)在XML數(shù)據(jù)庫大行其道,特別在數(shù)據(jù)交換領域,由于XML數(shù)據(jù)庫本身的特點,可以大顯身手,那么JDBC如何來操作XMLDB呢,我們舉幾個簡單的例子拋磚引玉一下吧
?
?
- 在數(shù)據(jù)庫中獲取XMLType類型的列值,比如存儲過程返回XmlType等,代碼如下:
public static String getOracleXMlType2String(Object obj){
try{
if(obj instanceof OPAQUE){
StringBuffer sb = new StringBuffer();
OPAQUE op =(OPAQUE)obj;
if(op!=null){
XMLType poxml = XMLType.createXML(op);
if(poxml!=null){
sb.append(poxml.getStringVal());
}
}
return sb.toString();
}
return obj.toString();
}catch(Exception ex){
return null;
}
}?
執(zhí)行存儲過程代碼:
Object[] res = DbUtils.ExecuteSP("{call 存儲過程名(?,?)}", new Object[]{ new SpParameter(Types.VARCHAR, "IN", "in參數(shù)", "in參數(shù)值") ,new SpParameter(OracleTypes.OPAQUE,"OUT","x",null)}, conn);?
?
- 可以通過XmlType列的clob值,代碼如下:
select x.sys_nc_rowinfo$.getclobval() as column_value from xmltypeTable
?
- 執(zhí)行存錯過程(存儲過程中含XmlTYPE返回值)
public static final Object[] ExecuteSP(String stmt, Object[] inparams, Connection connection) { int i = 1; CallableStatement st = null; SpParameter sp = null; SpParameter outp = null; int DataType; String Direction; String Name; String DataValue; try { st = connection.prepareCall(stmt); int oupcount = 0; for (i = 0; i < inparams.length; i++) { if (inparams[i] instanceof SpParameter) { sp = (SpParameter) inparams[i]; if (sp.GetDirection().toUpperCase().equals("IN")) { switch (sp.GetDataType()) { case Types.FLOAT: case Types.INTEGER: st .setLong(i + 1, Long.parseLong(sp .GetDataValue())); break; case Types.DATE: st.setDate(i + 1, java.sql.Date.valueOf(sp .GetDataValue())); break; case Types.SQLXML: st.setSQLXML(i + 1, null); break; default: st.setString(i + 1, sp.GetDataValue()); break; } } else { if(sp.getDataType() == OracleTypes.OPAQUE){ st.registerOutParameter (i+1, OracleTypes.OPAQUE,"SYS.XMLTYPE"); }else st.registerOutParameter(i + 1, sp.GetDataType()); oupcount = oupcount + 1; } } else st.setObject(i + 1, inparams[i]); } st.execute(); i = 1; if (oupcount > 0) { Object[] outps = new Object[oupcount]; int j = 0; for (i = 0; i < inparams.length; i++) { if (!(inparams[i] instanceof SpParameter)) continue; sp = (SpParameter) inparams[i]; if (!sp.GetDirection().toUpperCase().equals("IN")) { DataType = sp.GetDataType(); Direction = sp.GetDirection(); Name = sp.GetName(); switch (DataType) { case Types.FLOAT: DataValue = String.valueOf(st.getLong(i + 1)); break; case Types.INTEGER: DataValue = String.valueOf(st.getInt(i + 1)); break; case Types.DATE: DataValue = st.getDate(i + 1).toString(); break; case OracleTypes.OPAQUE: DataValue = getOracleXMlType2String(st.getObject(i+1)); break; default: DataValue = st.getString(i + 1); break; } sp.setDataValue(DataValue); outps[j++] = DataValue; // res.addElement(new SpParameter(DataType, Direction, // Name, // DataValue)); } } return outps; } else { return null; } } catch (SQLException ex) { } finally { if (st != null) { try { st.close(); } catch (Exception ex) { log.error(ex); } } } }?
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
JavaEye推薦