一.Oracle創建表及存儲過程
1.創建表T_MONITOR_DEVICE
創建后的表結構
2.創建存儲過程
create or replace procedure ProcTestNew(v_monitordeviceid in number,curdata out sys_refcursor ) As begin open curdata for select ID, IP,PORT from T_MONITOR_DEVICE where id=v_monitordeviceid;--帶參數測試 -- select ID, IP,PORT from T_MONITOR_DEVICE; end ProcTestNew;
二.java程序中調用
public void TestProc() { Connection conn=null; ResultSet rs=null; try { //this.getSession()為hibernate中的Session對象 conn = SessionFactoryUtils.getDataSource(this.getSession().getSessionFactory()).getConnection(); CallableStatement proc = conn.prepareCall("{call ProcTestNew(?,?) }"); BigDecimal b1 = new BigDecimal(1176); proc.setBigDecimal(1, b1); proc.registerOutParameter(2, OracleTypes.CURSOR); proc.execute(); rs = (ResultSet) proc.getObject(2); MonitorDevice m=new MonitorDevice(); while(rs != null && rs.next()) { m.setId(Integer.valueOf(rs.getObject(1).toString())); m.setIp((String)rs.getObject(2)); m.setPort((String)rs.getObject(3)); System.out.println(m.getId()+","+m.getIp()+","+m.getPort()); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
控制台輸出后的結果
三.注意問題
1.CallableStatement 輸入參數的set是從1開始的,同理輸出參數的獲取也是從1開始的
2.存儲過程中輸入參數為number類型的,在java程序中,對應的參數為BigDecimal,程序中存儲過程放進參數用setBigDecimal(),輸入參數為VARCHAR2()類型的,java對應的參數為String,程序中的存儲過程set參數用setString()方法