用java调用oracle存储过程总结.docx

上传人:wux****ua 文档编号:9122262 上传时间:2020-04-03 格式:DOCX 页数:9 大小:35.18KB
返回 下载 相关 举报
用java调用oracle存储过程总结.docx_第1页
第1页 / 共9页
用java调用oracle存储过程总结.docx_第2页
第2页 / 共9页
用java调用oracle存储过程总结.docx_第3页
第3页 / 共9页
点击查看更多>>
资源描述
用java调用oracle存储过程总结 分类: PL/SQL系列 2009-09-24 15:08 253人阅读 评论(0) 收藏 举报 声明:以下的例子不一定正确,只是为了演示大概的流程。一:无返回值的存储过程存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGIN INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA;然后呢,在java里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.sql.ResultSet;public class TestProcedureOne public TestProcedureOne() public static void main(String args ) String driver = oracle.jdbc.driver.OracleDriver; String strUrl = jdbc:oracle:thin:127.0.0.1:1521: hyq ; Statement stmt = null; ResultSet rs = null; Connection conn = null; CallableStatement cstmt = null; try Class.forName(driver); conn = DriverManager.getConnection(strUrl, hyq , hyq ); CallableStatement proc = null; proc = conn.prepareCall( call HYQ.TESTA(?,?) ); proc.setString(1, 100); proc.setString(2, TestOne); proc.execute(); catch (SQLException ex2) ex2.printStackTrace(); catch (Exception ex2) ex2.printStackTrace(); finally try if(rs != null) rs.close(); if(stmt!=null) stmt.close(); if(conn!=null) conn.close(); catch (SQLException ex1) 二:有返回值的存储过程(非列表)当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。存储过程为:CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) ASBEGIN SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1; END TESTB;在java里调用时就用下面的代码:package com.hyq.src;public class TestProcedureTWO public TestProcedureTWO() public static void main(String args ) String driver = oracle.jdbc.driver.OracleDriver; String strUrl = jdbc:oracle:thin:127.0.0.1:1521:hyq; Statement stmt = null; ResultSet rs = null; Connection conn = null; try Class.forName(driver); conn = DriverManager.getConnection(strUrl, hyq , hyq ); CallableStatement proc = null; proc = conn.prepareCall( call HYQ.TESTB(?,?) ); proc.setString(1, 100); proc.registerOutParameter(2, Types.VARCHAR); proc.execute(); String testPrint = proc.getString(2); System.out.println(=testPrint=is=+testPrint); catch (SQLException ex2) ex2.printStackTrace(); catch (Exception ex2) ex2.printStackTrace(); finally try if(rs != null) rs.close(); if(stmt!=null) stmt.close(); if(conn!=null) conn.close(); catch (SQLException ex1) 注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。三:返回列表由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1, 建一个程序包。如下:CREATE OR REPLACE PACKAGE TESTPACKAGE AS TYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;2,建立存储过程,存储过程为:CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS BEGIN OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。在java里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.io.OutputStream;import java.io.Writer;import java.sql.PreparedStatement;import java.sql.ResultSet;import oracle.jdbc.driver.*;public class TestProcedureTHREE public TestProcedureTHREE() public static void main(String args ) String driver = oracle.jdbc.driver.OracleDriver; String strUrl = jdbc:oracle:thin:127.0.0.1:1521:hyq; Statement stmt = null; ResultSet rs = null; Connection conn = null; try Class.forName(driver); conn = DriverManager.getConnection(strUrl, hyq, hyq); CallableStatement proc = null; proc = conn.prepareCall( call hyq.testc(?) ); proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR); proc.execute(); rs = (ResultSet)proc.getObject(1); while(rs.next() System.out.println( + rs.getString(1) + +rs.getString(2)+); catch (SQLException ex2) ex2.printStackTrace(); catch (Exception ex2) ex2.printStackTrace(); finally try if(rs != null) rs.close(); if(stmt!=null) stmt.close(); if(conn!=null) conn.close(); catch (SQLException ex1) 四。Hibernate调用存储过程Connection con = session.connect(); CallableStatement proc = null; con = connectionPool.getConnection(); proc = con.prepareCall( call set_death_age(?, ?) ); proc.setString(1, XXX); proc.setInt(2, XXx); . proc.execute(); session.close(); 在Hibernate中调用存储过程的示范代码- - 如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:create or replace procedure batchUpdateStudent(p_age in number) asbeginupdate STUDENT set AGE=AGE+1 where AGEp_age;end;以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程:tx = session.beginTransaction();Connection con=session.connection();String procedure = call batchUpdateStudent(?) ;CallableStatement cstmt = con.prepareCall(procedure);cstmt.setInt(1,0); /把年龄参数设为0cstmt.executeUpdate();tx.commit();在以上代码中,我用的是Hibernate的 Transaction接口来声明事务,而不是采用JDBC API来声明事务。存储过程中有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程: 代码内容 tx = session.beginTransaction(); Connection con=session.connection(); String procedure = call batchUpdateCustomer(?) ; CallableStatement cstmt = con.prepareCall(procedure); cstmt.setInt(1,0); /把年龄参数设为0 cstmt.executeUpdate(); tx.commit(); CREATE procedure selectAllUsers DYNAMIC RESULT SETS 1 BEGIN DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR SELECT * FROM test; OPEN temp_cursor1; END; 映射文件中关于存储过程内容如下 . ? = call selectAllUsers() ? = call selectAllUsers() 也可以写成 call selectAllUsers() , 如果有参数就写成 ? = call selectAllUsers(?,?,?) 代码中对query设置相应位置上的值就OK Java调用关键代码如下 Session session = HibernateUtil.currentSession(); Query query = session.getNamedQuery(selectAllUsers); List list = query.list(); System.out.println(list); 要求你的存储过程必须能返回记录集,否则要出错 如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签 call createPerson (?, ?) ? = call deletePerson (?) ? = call updatePerson (?, ?) 有一点不好的地方就是调用存储过程获取记录集时,不能对Query使用 setFirstResult(int)和setMaxResults(int)方法来分页
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!