Oracle存储过程的调用
来源:互联网 发布:中国大棚农业数据库 编辑:程序博客网 时间:2024/04/30 15:50
好久没有写博客了,今天又来写一篇,工作都好久没有用到Oracle数据库了,昨天做了一个Oracle数据库存储过程的例子,用JAVA APP去调用,现在把代码传上来:
首先:还是先把存储过程写好!(关于对一张表的分页查询)
--因为现在好多Web App,在JS端口都有封装好的grid控件,所以这里,只传开始记录数,和结束记录就可以了。简单的练习而已CREATE OR REPLACE PROCEDURE PROC_PAGINATION( START_NUM IN INT --输入参数:分页的开始记录数 ,END_NUM IN INT --输入参数:分页的结束记录数 ,TOTAL_COUNT OUT INT --输出参数:总记录数 ,PAGE_RESULT_SET OUT SYS_REFCURSOR --Oracle的游标查询结果集) ASCOUNT_SQL VARCHAR2(200); --定义变量:查询总记录数的SQLV_SQL VARCHAR2(400); --定义变量:分页查询结果集的SQLBEGIN COUNT_SQL := 'SELECT COUNT(*) FROM MYMIS.TB_MYMIS_RESOURCES_MENU'; EXECUTE IMMEDIATE COUNT_SQL INTO TOTAL_COUNT; --把查询的记录数结果,给输出参数 --V_SQL := 'SELECT * FROM (SELECT TEMP.*,ROWNUM AS RN FROM (SELECT * FROM MYMIS.TB_MYMIS_RESOURCES_MENU ORDER BY RESOURCE_ID ASC) TEMP WHERE ROWNUM <= ' || END_NUM || ') WHERE RN > ' || START_NUM; V_SQL := 'SELECT * FROM (SELECT ROWNUM AS RN,A.* FROM MYMIS.TB_MYMIS_RESOURCES_MENU A WHERE ROWNUM <= ' || END_NUM || ' ORDER BY A.RESOURCE_ID ASC) WHERE RN > ' || START_NUM; OPEN PAGE_RESULT_SET FOR V_SQL; --把游标查询的结果集给输出参数END PROC_PAGINATION;END PROC_PAGINATION;存储过程写好了,下面是普通JDBC类的调用:(这里就写了一个main方法,做测试用)
public static void main(String[] args) {//Connection con = ConnectionFactory.getConnection();//if (con != null) {//System.out.println("连接正常...");//} else {//System.out.println("连接出错...");//}Connection conn = ConnectionFactory.getConnection(); //获取数据库连接 CallableStatement cs; //定义JDBC调用存储过程的类try {cs = conn.prepareCall("call MYMIS.PROC_PAGINATION(?,?,?,?)"); //调用存储过程cs.setInt(1, 4); //匹配输入,输出参数 cs.setInt(2, 8); cs.registerOutParameter(3, Types.INTEGER); cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); cs.execute(); //执行存储过程 int totalPage = cs.getInt(3); //将输出参数给一个变量 System.out.println("共有" + totalPage + "页"); ResultSet rs = (ResultSet) cs.getObject(4); //将输出结果集,给一个ResultSet while (rs.next()) { System.out.println(rs.getString("RESOURCE_ID")+","+rs.getString("RESOURCE_NAME") +"," + rs.getString("RESOURCE_TYPE")); }} catch (SQLException e) {e.printStackTrace();}}下面做了一个JdbcTemplate的调用,个人觉得数据库持久层,spring的JdbcTemplate是个好东西,查询效率也蛮快的,而且查询方法也很多。同样写在main方法里
public static void main(String[] args) { ClassPathXmlApplicationContext appctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //读取spring的全局配置文件 JdbcTemplate jdbcTemplate = (JdbcTemplate) appctx.getBean("jdbcTemplate"); //通过BeanId,从Bean工厂里获取到定义的jdbcTemplate对象类,如果不这样new 出来JdbcTemplate为null// Object[] params = new Object[] { "111", "test", "99", "测试地市", "888",// "测试部门", "888888", "2" };//// jdbcTemplate.execute("call MYMIS.PROC_PAGINATION(?,?,?,?)"); //jdbcTemplate.execute这样去调用存储过程,jdbcTemplate.execute(CallableStatementCreator arg0, CallableStatementCallback arg1) 两个参数,一个是创建调用存储过程对象,另一个是返回参数 List resultList = (List)jdbcTemplate.execute( new CallableStatementCreator(){ public CallableStatement createCallableStatement( Connection con) throws SQLException { String storedProc = "{call MYMIS.PROC_PAGINATION(?,?,?,?)}";//调用存储过程 CallableStatement cs = con.prepareCall(storedProc); cs.setInt(1, 4); //匹配输入输出参数 cs.setInt(2, 8); cs.registerOutParameter(3, Types.INTEGER); cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); return cs; //返回execute()方法的第一个参数,创建CallableStatement的对象 } },new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { List resultsMap = new ArrayList(); cs.execute(); int count = cs.getInt(3); //输出参数1 System.out.println(count); ResultSet rs = (ResultSet) cs.getObject(4); //输入出结果集 while (rs.next()) {// 转换每行的返回值到Map中 Map rowMap = new HashMap(); //rowMap.put("total", count); rowMap.put("rs", rs); System.out.println(rs.getString("RESOURCE_NAME")); resultsMap.add(rowMap);//返回execute()方法的第二个参数,CallableStatementCallback的对象 } rs.close(); return resultsMap; //将整个调用存储过程得到的参数返回。 } } ); }大致就是这样的,代码都经过本机测试过的!!感觉很多数据库的存储过程写法有些差异,不过都大同小异。
0 0
- Oracle存储过程的调用
- Oracle存储过程的调用
- Oracle存储过程的调用
- Oracle存储过程的调用
- oracle调用存储过程
- Oracle调用存储过程
- oracle调用存储过程
- oracle 存储过程调用
- ORACLE的存储过程的异步调用
- ORACLE的存储过程的异步调用
- Oracle 存储过程 调用带有 out 参数的存储过程
- Oracle存储过程调用带参的存储过程
- ORACLE存储过程(二)之存储过程的调用
- ORACLE存储过程调用存储过程时commit的问题
- Oracle存储过程调用带参的存储过程
- delphi中调用oracle的存储过程
- Spring 调用ORACLE存储过程的结果
- Java调用Oracle的存储过程(实例)
- 用JUnit进行单元测试
- 可重入函数
- asio乱写——io_service之post方法
- mochiweb学习--创建工程调试
- 安卓入门:动态添加╱删除的Spinner 菜单
- Oracle存储过程的调用
- Binary Tree Maximum Path Sum 二叉树最大路径和
- 设置ssh自动登录
- Revo Uninstaller Pro - 真正彻底卸载软件不留垃圾的强大神器!(清理安装残留文件/注册表)
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- linux 命令行快捷键
- 2.8.16与10进制间的关系
- 网购要趁早 各大快递公司春节放假时间表出炉
- PCI、PCI-x,PCI-E兼容以及他们之间的区别详细图解