pl/sql编程2-综合
案例1,要求:可以向book表添加书,并通过Java程序调用该过程1.1 创建表
create table book(bookId number,bookName varchar2(20),publishHosuse varchar2(20));
1.2 编写过程,无返回值
create or replace procedure test_pro9(tbookId number,tbookName varchar2,tpublishHouse varchar2) is begin insert into book values(tbookId,tbookName,tpublishHouse); end;
在Java中调用
package com.oracle; import java.sql.*; public class TestPaging { public static void main(String args[]){ try { //1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2.得到链接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger"); //3.创建CallableStaement CallableStatement cs=ct.prepareCall("{call test_pro9(?,?,?)}"); //4.给问号赋值 cs.setInt(1,1); cs.setString(2,"笑傲江湖"); cs.setString(3,"人民出版社"); //5.执行 cs.execute(); //6.关闭资源 cs.close(); ct.close(); } catch (Exception e) { e.printStackTrace(); } } }
1.3创建存储过程,有返回值
--in 表示输入,默认就是in,out是输出
create or replace procedure test_pro10(tId in number,tname out varchar2) is begin select bookName into tname from book where bookId=tId; end;
在Java中调用
package com.oracle; import java.sql.*; public class TestPaging { public static void main(String args[]){ try { //1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2.得到链接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger"); //3.创建CallableStaement CallableStatement cs=ct.prepareCall("{call test_pro10(?,?)}"); //4.给问号赋值 cs.setInt(1,1); cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); //5.执行 cs.execute(); String bookname=cs.getString(2); System.out.println("1号书的名字是:"+bookname); //6.关闭资源 cs.close(); ct.close(); } catch (Exception e) { e.printStackTrace(); } } }
1.4创建存储过程,有返回值,并且是个结果集
--建立一个包 create or replace package test_pck2 as type test_cursor is ref cursor; end test_pck2; --建立一个存储过程 create procedure test_pro11(tNo in number,t_cursor out test_pck2.test_cursor) is begin open t_cursor for select * from myemp where deptno=tNo; end;
在Java中调用
package com.oracle; import java.sql.*; public class TestPaging { public static void main(String args[]){ try { //1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2.得到链接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger"); //3.创建CallableStaement CallableStatement cs=ct.prepareCall("{call test_pro11(?,?)}"); //4.给问号赋值 cs.setInt(1,10); cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR); //5.执行 cs.execute(); //6.得到结果集 ResultSet rs=(ResultSet)cs.getObject(2); while(rs.next()){ System.out.println(rs.getInt(1)+" "+rs.getString(1)); } //7.关闭资源 cs.close(); ct.close(); } catch (Exception e) { e.printStackTrace(); } } }
案列2,编写分页的过程
要求:输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回结果集
--要求:输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回结果集 --创建一个包,定义一个游标 create or replace package test_pck2 as type test_cursor is ref cursor; end test_pck2; create or replace procedure test_pro12 (tableName in varchar2, --表名 pageCount in number, --每页记录数 pageNow in number, --当前页 allRows out number, --总记录数 allPages out number, --总页数 p_cursor out test_pck2.test_cursor --返回的结果集 ) is --定义部分 --定义两个整数 v_begin number:=(pageNow-1)*pageCount+1; v_end number:=pageNow*pageCount; --定义SQL语句,字符串 v_sql varchar2(1000); begin v_sql:='select * from (select a1.*,rownum rn from (select * from '||tableName||') a1 where rownum<='||v_end||') where rn>'||v_begin; --把游标和SQL关联起来 open p_cursor for v_sql; --计算allRows v_sql:='select count(*) from '||tableName; execute immediate v_sql into allrows; --计算allPages,注意取模的函数的写法 if mod(allRows,pageCount)=0 then allPages:=allRows/pageCount; else allPages:=allRows/pageCount+1; end if; --关闭游标 --close p_cursor; end;
使用Java测试
package com.oracle; import java.sql.*; public class TestPaging { public static void main(String args[]){ try { //1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2.得到链接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger"); //3.创建CallableStaement CallableStatement cs=ct.prepareCall("{call test_pro12(?,?,?,?,?,?)}"); //4.给问号赋值 cs.setString(1,"emp"); cs.setInt(2,5); cs.setInt(3,1); //注册总记录数 cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER); //注册总页数 cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER); //注册返回的结果集 cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR); //5.执行 cs.execute(); //取出总记录数 int rowNum=cs.getInt(4); //取出总页数 int allCount=cs.getInt(5); ResultSet rs=(ResultSet)cs.getObject(6); //取出结果 System.out.println("总记录数: "+rowNum); System.out.println("总页数: "+allCount); while(rs.next()){ System.out.println("编号:"+rs.getInt(1)+"名字: "+rs.getString(2)); //注意这里的数字1,2分表代表表中的1,2列 } //7.关闭资源 cs.close(); ct.close(); } catch (Exception e) { e.printStackTrace(); } } }