一.只有输入参数没有返回结果的存储过程二.有输入和有一个返回值的存储过程三、返回多行记录的存储过程(返回的是游标)四、Hibernate调用oracle存储过程一.只有输入参数没有返回结果的存储过程建表createtabletable_1(idvarchar2(10),namevarchar2(10));--没有返回值的存储过程createorreplaceprocedureprc_1(t_idinvarchar2,t_nameinvarchar2)asbegininsertintotable_1values(t_id,t_name);endprc_1;1.在sqlplus中执行SQL>execprc_1('1','杨2');PL/SQLproceduresuccessfullycompleted2.在java中执行,返回结果Class.forName("oracle.jdbc.OracleDriver").newInstance();Stringurl="jdbc:oracle:thin:atf_ygj/mas123@192.168.6.19:1531:orcl";Stringuser="atf_ygj";Stringpassword="mas123";conn=DriverManager.getConnection(url,user,password);conn.setAutoCommit(false);cstmt=conn.prepareCall("{callprc_1(?,?)}");cstmt.setString(1,"100");cstmt.setString(2,"TestOne");cstmt.execute();conn.commit();========================================二.有输入和有一个返回值的存储过程--有一个返回值的存储过程createorreplaceprocedureprc_2(t_idINVARCHAR2,t_nameOUTVARCHAR2)ASbeginSELECTnameINTOt_nameFROMtable_1WHEREid=t_idandrownum<2;endprc_2;1.在sqlplus中执行,返回结果SQL>varnamevarchar2(100);SQL>execprc_2('1',:name);PL/SQLproceduresuccessfullycompletedname---------杨22.在java中执行,返回结果Class.forName("oracle.jdbc.OracleDriver").newInstance();Stringurl="jdbc:oracle:thin:atf_ygj/mas123@192.168.6.19:1531:orcl";Stringuser="atf_ygj";Stringpassword="mas123";conn=DriverManager.getConnection(url,user,password);conn.setAutoCommit(false);cstmt=conn.prepareCall("{callprc_2(?,?)}");cstmt.setString(1,"1");cstmt.registerOutParameter(2,Types.VARCHAR);cstmt.execute();conn.commit();StringtestPrint=cstmt.getString(2);System.out.println("返回值::::::"+testPrint);输出:返回值::::::杨2三、返回多行记录的存储过程(返回的是游标)由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。createorreplacepackagetest_packageastypetest_CURSORisrefcursor;endtest_package;2,建立存储过程,存储过程为:createorreplaceprocedureprc_3(p_CURSORouttest_package.test_CURSOR)isbeginOPENp_CURSORFORSELECT*FROMtable_1orderbyid;endprc_3;可以看到,它是把游标(可以理解为一个指针),作为一个out参数来返回值的。===========================3.在java中的执行Class.forName("oracle.jdbc.OracleDriver").newInstance();Stringurl="jdbc:oracle:thin:atf_ygj/mas123@192.168.6.19:1531:orcl";Stringuser="atf_ygj";Stringpassword="mas123";conn=DriverManager.getConnection(url,user,password);cstmt=conn.prepareCall("{callprc_3(?)}");cstmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);cstmt.execute();rs=(ResultSet)cstmt.getObject(1);while(rs.next()){System.out.println("
"+rs.getString(1)+" | "+rs.getString(2)+" |
");}输出结果:1 | 杨2 |
100 | TestOne |
100 | 杨1 |
100 | TestOne |
200 | Test2 |
4.在sqlplus中执行用一个存储过程调用prc_3createorreplaceprocedureprc_4isctest_package.test_CURSOR;idvarchar2(100);namevarchar2(100);beginprc_3(c);LOOPFETCHcINTOid,name;EXITWHENc%NOTFOUND;DBMS_OUTPUT.PUT_LINE('=='||id||'==='||name);ENDLOOP;CLOSEc;endprc_4;执行SQL>setserveroutputon;SQL>execdbms_output.enable(999999999999999999999);PL/SQLproceduresuccessfullycompletedSQL>execprc_4;==1===杨2==100===TestOne==100===杨1==100===TestOne==200===Test2PL/SQLproceduresuccessfullycompleted四、Hibernate调用oracle存储过程privatevoidprc_test(){getHibernateTemplate().execute(newHibernateCallback(){publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{CallableStatementcstmt=session.connection().prepareCall("{callprc_3(?)}");cstmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);cstmt.execute();ResultSetrs=(ResultSet)cstmt.getObject(1);while(rs.next()){System.out.println(""+rs.getString(1)+" | "+rs.getString(2)+" |
");}returnnull;}},true);}