oracle(6)pl/sql的进价、编写分页过程--编写一个过程,可以向book表添加书,要求通过java程序调用该过程案例1(无返回值)--建表--book表createtablebook(bookIdnumber,bookNamevarchar2(50),publishH...
oracle(6)pl/sql的进价、编写分页过程
--编写一个过程,可以向book表添加书,要求通过java程序调用该过程
案例1(无返回值)
--建表
-- book表
create table book
(bookId number,bookName varchar2(50),publishHouse varchar2(50));
www.2cto.com
--编写过程
-- in 表示这是一个输入参数 不写 默认为in
-- out 表示一个输出参数
create or replace procedure sp_pro7
(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is
begin
insert into book values(spBookId,spbookName,sppublishHouse);
end;
--在java中调用
//调用一个无返回值的过程
public class Test1{
public static void main(String[] args){
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.
OracleDriver");
Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
//2.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
//给?赋值
cs.setInt(1,10);
cs.setString(2,"笑傲江湖");
cs.setString(3,"人民出版社");
//执行
cs.execute();
//关闭
cs.close();
ct.close();
} catch (Exception e){
e.printStackTrace();
} www.2cto.com
}
}
案例2(有输入和输出的存储过程)
--有输入和输出的存储过程
create or replace procedure sp_pro8
(spno in number,spName out varchar2) is
begin
select ename into spName from emp where empno=spno;
end;
--在java中调用
//调用一个有返回值的过程
public class Test1{
public static void main(String[] args){
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
//如何调用有返回值的过程
//2.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");
//给第一个?赋值
cs.setInt(1,7788);
//给第二个?赋值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
www.2cto.com
//执行
cs.execute();
//取回返回值,要注意?顺序
String name=cs.getString(2);
System.out.println("7788的名字"+name);
//关闭
cs.close();
ct.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
**调用返回多个值 和返回一个值一样
案例3(返回结果集的过程)
--1 创建一个包,在该包中,我定义类型test_cursor,是个游标
create or replace package tespackage as
type test_cursor is ref cursor;
end tespackage;
--2 创建过程
create or replace procedure sp_pro9
(spNo in number,p_cursor out tespackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno=spNo;
end;
--3 java调用
public class Test1{
public static void main(String[] args){
try{ www.2cto.com
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
//如何调用有返回值的过程
//2.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");
//给第一个?赋值
cs.setInt(1,7788);
//给第二个?赋值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
//执行
cs.execute();
//得到结果集
ResultSet rs =(ResultSet)cs.getObject(2);
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
//关闭
cs.close();
ct.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
--编写分页过程
编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数、总页数、和返回的结果集
www.2cto.com
--oracle的分页
select t1.*,rownum rn from (select * from emp) t1
select t1.*,rownum rn from (select * from emp) t1 where rownum<=10
--在分页时,可以把下面的sql语句当做一个模版使用
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)
where rn>=6
--开发一个包
create or replace package tespackage as
type test_cursor is ref cursor;
end tespackage;
--开始编写分页的过程
create or replace procedure fenye
(tableName in varchar2,
pageSize in number,--一页显示的记录数
pageNow in number,
myrows out number,--总记录数
myPageCount out number,--总页数
p_cursor out tespackage.test_cursor--返回的记录数
) is www.2cto.com
--定义部分
--定义sql语句 字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow)*pageSize;
begin
--执行部分
v_sql:=&#39;select * from (select t1.*,rownum rn from (select * from &#39;||tableName||&#39;) t1 where rownum<=&#39;||v_end||&#39;) where rn>=&#39;||v_begin||&#39;&#39;;
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql
v_sql:=&#39;select count(*) from &#39;||tableName;
--执行sql,并把返回的值赋值给myrows
execute immediate v_sql into myrows;
--计算myPageCount
if mod(myrows,pageSize)=0 then
myPageCount:=myrows/pageSize;
else
myPageCount:=myrows/pageSize+1;
end if;
--关闭游标
close p_cursor;
end;
--使用java测试
www.2cto.com
public class FenYe{
public static void main(String[] args){
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
//如何调用有返回值的过程
//2.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
//给?赋值
cs.setString(1,"emp");
cs.setInt(2,5);
cs.setInt(3,1);
www.2cto.com
//注册总记录数
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
//注册总页数
cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
//注册返回的结果集
cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);
//执行
cs.execute();
//取出总记录数/这里要注意,getInt(4)中4,是由该参数的位置决定的
int rowNum = cs.getInt(4);
int pageCount = cs.getInt(5);
//得到结果集
ResultSet rs =(ResultSet)cs.getObject(6);
//显示一下
System.out.println("rowNum="+rowNum);
System.out.println("总页数:"+pageCount);
while(rs.next()){
System.out.println("编号:"+rs.getInt(1)+"名字:"+rs.getString(2));
}
www.2cto.com
//关闭
cs.close();
ct.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
作者 kyle8525_nsn