版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xky1306102chenhong/article/details/82725942
1. 【无返回值的过程】--现有一张表book,表结构【书号,书名,出版社】,编写过程,可以向book表添加书,要求通过java程序调用
- 存储过程
--现有一张表book,表结构【书号,书名,出版社】 --编写过程,可以向book表添加书,要求通过java程序调用 create or replace procedure add_book_pro(chbookid in number,chbookname in varchar2,chpublishhouse in varchar2) is begin insert into book values(chbookid,chbookname,chpublishhouse); end;
- Java代码
package com.chris; import java.sql.*; public class AddBook { public static void main(String[] args) { // TODO Auto-generated method stub try{ // 1. 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2. 获得连接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","SCOTT","tiger"); // 3. 创建callablestatement,用于调用存储过程 CallableStatement cs=ct.prepareCall("{call add_book_pro(?,?,?)}"); // 4. 给?赋值 cs.setInt(1, 1); cs.setString(2, "Java"); cs.setString(3, "HNU Publish"); // 5. 执行 cs.execute(); // 6. 关闭资源 cs.close(); ct.close(); }catch(Exception e){ e.printStackTrace(); } } }
2. 【带返回值的过程】
- 存储过程:
-- 编写一个过程,可以输入书的编号,返回该书名 create or replace procedure query_bookname_by_id(ch_id number,ch_name out varchar2) is begin select book.bookname into ch_name from book where book.bookid=ch_id; end;
- Java代码:
package com.chris; import java.sql.*; public class QueryBook { public static void main(String[] args) { // TODO Auto-generated method stub try{ //1. 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2. 得到连接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger"); //3. 创建CallableStatement CallableStatement cs = ct.prepareCall("{call query_bookname_by_id(?,?)}"); //4. 给?赋值 cs.setInt(1, 1); cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); //5. 执行 cs.execute(); //取出返回值 String name = cs.getString(2); System.out.println("第1本书是:"+name); }catch(Exception e){ e.printStackTrace(); }finally{ //关闭资源 } } }
3. 【返回结果集的存储过程】
问题:编写一个过程,输入部门号,返回该部门所有雇员信息。
分析:由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来代替的,列表同样也不例外,但由于是集合,不能用一般的参数,必须要用package了,所以要分两部分:
- 存储过程:
--分析:由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来代替的,列表同样也不 --例外,但由于是集合,不能用一般的参数,必须要用package了,所以要分两部分: --1. 建一个包,如下: create or replace package test_package as --声明 type test_cursor_type is ref cursor; end; --2. 建立存储过程 create or replace procedure query_emp_by_deptno(chno in number,ch_cursor out test_package.test_cursor_type) is begin open ch_cursor for select * from emp where deptno=chno; --close ch_cursor; end; --3.如何在Java中调用该过程
- Java代码:
package com.chris; import java.sql.*; public class Review { public static void main(String[] args) { // TODO Auto-generated method stub Connection ct=null; CallableStatement cs=null; ResultSet rs=null; try{ // 1. 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2. 得到连接 ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", "tiger"); // 3. 创建CallableStatement cs=ct.prepareCall("{call query_emp_by_deptno(?,?)}"); // 4. 给?赋值 cs.setInt(1, 20); cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); // 5. 执行 cs.execute(); // 7. 得到结果集 rs=(ResultSet)cs.getObject(2); // 8. 循环取出 while(rs.next()){ System.out.println(rs.getInt(1)+" "+rs.getString(2)); } }catch(Exception e){ e.printStackTrace(); }finally{ // 6. 关闭资源 try{ if(rs!=null){ rs.close(); } if(cs!=null){ cs.close(); } if(ct!=null){ ct.close(); } }catch(Exception e){ e.printStackTrace(); } } } }
4. 分页存储过程
- 存储过程:
-- 编写一个过程,要求可以输入表名、每页显示记录数、当前页。 -- 返回 总记录数,总页数,和返回的结果集。 -- Oracle的分页 -- 1. select * from emp; -- 2. select t.*,rownum rn from (select * from emp) t; -- 3. select t.*,rownum rn from (select * from emp) t where rownum<=10; -- 4. select * from (select t.*,rownum rn from (select * from emp) t where rownum<=10) where rn>=6; -- 创建一个包 create or replace package paging_package as --声明一个游标类型 type paging_cursor_type is ref cursor; end; -- 开始编写分页的过程 create or replace procedure paging_pro (table_Name in varchar2, page_size in number, pageNow in number, myrowcount out number,--总记录数 mypagecount out number,--总页数 paging_cursor out paging_package.paging_cursor_type) is--返回的记录集 --定义变量 --定义SQL语句 字符串 v_sql varchar2(1000); --定义两个整数 v_begin number:=(pageNow-1)*page_size+1; v_end number:=pageNow*page_size; begin --执行部分 v_sql:='select * from (select t.*,rownum rn from (select * from '||table_Name||' order by sal) t where rownum<='||v_end||') where rn>='||v_begin; --把游标和sql语句关联 open paging_cursor for v_sql; --计算myrowcount和mypagecount v_sql:='select count(*) from '||table_Name; execute immediate v_sql into myrowcount; if mod(myrowcount,page_size)=0 then mypagecount:=myrowcount/page_size; else mypagecount:=myrowcount/page_size+1; end if; --关闭游标 close paging_cursor; end; -- 使用Java程序测试
5. 分页V2
- 存储过程:
-- 编写一个过程,要求可以输入表名(table_name)、每页显示记录数(page_size)、当前页(page_now)。 -- 返回总记录数(row_count)、总页数(page_count)和结果集游标(paging_cursor)。 create or replace procedure paging_pro( table_name in varchar2, page_size in number, page_now in number, row_count out number, page_count out number, paging_cursor out paging_package.paging_cursor_type ) is -- 定义部分 v_sql varchar2(1000); v_begin number:=(page_now-1)*page_size+1; v_end number:=page_now*page_size; begin --执行部分 v_sql:='select * from (select t.*,rownum rn from (select * from '||table_name||') t where rownum<='||v_end||') where rn>='||v_begin; --打开游标,将之与sql语句关联 open paging_cursor for v_sql; --close paging_cursor; v_sql:='select count(*) from '||table_name; execute immediate v_sql into row_count; if mod(row_count,page_size)=0 then page_count:=row_count/page_size; else page_count:=row_count/page_size+1; end if; end; -- 创建一个分页包,来定义分页游标类型 create or replace package paging_package as type paging_cursor_type is ref cursor; end; select * from emp; select t.*,rownum rn from (select * from emp) t where rownum<=10; select * from (select t.*,rownum rn from (select * from emp) t where rownum<=10) where rn>=6;
- Java代码:
package com.chris; import java.sql.*; public class PagingTest { public static void main(String[] args) { // TODO Auto-generated method stub Connection ct=null; CallableStatement cs=null; ResultSet rs=null; //总记录数 int RowCount; int PageCount; try{ // 1. 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2. 得到连接 ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger"); // 3. 创建CallableStatement cs=ct.prepareCall("{call paging_pro(?,?,?,?,?,?)}"); // 4. 给?赋值 cs.setString(1, "emp"); cs.setInt(2, 3); cs.setInt(3, 2); // 总记录数 cs.registerOutParameter(4, oracle.jdbc.OracleTypes.NUMBER); // 总页数 cs.registerOutParameter(5, oracle.jdbc.OracleTypes.NUMBER); // 结果集游标 cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR); // 5. 执行 cs.execute(); // 7. 得到结果集 RowCount=cs.getInt(4); PageCount=cs.getInt(5); rs=(ResultSet)cs.getObject(6); // 8. 循环取出 while(rs.next()){ System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getInt(6)); } }catch(Exception e){ e.printStackTrace(); }finally{ //关闭资源 try{ if(rs!=null){ rs.close(); } if(cs!=null){ cs.close(); } if (ct!=null){ ct.close(); } }catch(Exception e){ } } } }