Oracle笔记整理(6)

2019-04-08 21:42

13.调用存储过程

/**

* 调用存储过程 * 1.创建连接

* 2.创建CallableStatement对象:执行存储过程的对象 :conn.prepareCall(\存储过程名称(?,?,?)}\

* 3.为输入参数绑定值,为输出参数注册类型

* 4.执行存储过程 ,调用 CallableStatement对象中的execute方法 * 5.获取输出的值:CallableStatement对象中的getXxx(输出参数下标); * 6.释放资源 * @param args

*/

public static void main(String[] args) {

try { Class.forName(\

Connection

conn

=

DriverManager.getConnection(\

// System.out.println(conn);

//{call 存储过程名称(?,?,?)}

CallableStatement csmt = conn.prepareCall(\

//为占位符绑定值:如果是输入参数(in):setXxx()方法绑定输入参数,如果是输出参数(out):使用registerOutParameter()方法注册输出参数 csmt.setString(1, \表名 csmt.setInt(2, 4);//绑定第二个占位符的值(分页单位)

csmt.registerOutParameter(3, oracle.jdbc.OracleTypes.INTEGER); //注册一个输出

类型的参数 //调用 execute方法执行存储过程 boolean isCorrect = csmt.execute();//如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false

}

int totalPages = csmt.getInt(3);//获取输出参数的值 System.out.println(\ System.out.println(\csmt.close(); conn.close();

} catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }

14.程序包

/*

包:程序包是对相关过程、函数、变量、游标和异常等对象的封装,程序包由规范和主体两部分组成

--声明程序包

CREATE [OR REPLACE] PACKAGE

package_name IS|AS [Public item declarations] [Subprogram specification] END [package_name]; --声明程序包的主题

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS [Private item declarations] [Subprogram bodies] [BEGIN

Initialization] END [package_name]; */

create or replace package my_pack is

procedure pro6(hello varchar2); end;

create or replace package body my_pack is

procedure pro6(hello varchar2) is

begin

dbms_output.put_line(hello); end;

end;

--调用程序包中对象

begin

my_pack.pro6('hello world'); end;

15触发器

/*

触发器:触发器是当特定事件出现时自动执行的存储过程 语法:

CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF

[INSERT] [[OR] UPDATE [OF column_list]]

[[OR] DELETE] ON table_name [FOR EACH ROW] begin

pl/sql_block; end; */

--利用触发器,维护部门人数

--(如果新添加员工,让部门人数+1; --如果删除员工,让部门人数-1;

--如果为员工更改部门:原有部门人数-1,现有部门人数+1)

create table tbl_dept (

deptId number(4) primary key, deptName varchar2(20), deptNum number(4) )

create table tbl_emp

(

empId number(4) primary key,

empName varchar2(20),

deptId number(4) references tbl_dept(deptId) )

create or replace trigger tri_dept after insert or update or delete on tbl_emp for each row begin

if inserting then

update tbl_dept set deptNum = deptNum+1 where deptId=:new.deptId;--:new新增的记录 elsif deleting then

update tbl_dept set deptNum = deptNum-1 where deptId=:old.deptId; --:old旧数据 elsif updating then --:new 新纪录; :old 旧记录

update tbl_dept set deptNum = deptNum-1 where deptId=:old.deptId; update tbl_dept set deptNum = deptNum+1 where deptId=:new.deptId; end if; end;

insert into tbl_emp values(4,'zhaoliu',1) delete from tbl_emp where empId=4

update tbl_emp set deptId = 2 where empId=2

16.存储过程-分页

--使用存储过程进行分页 --分页,rownum select * from emp

select rownum rn,A.* from (select * from emp) A

select rownum rn,A.* from (select * from emp) A where rownum<4 --第一页

select rownum rn,A.* from (select * from emp) A where rownum>3 and rownum<7 --错误 select rownum rn,A.* from (select * from emp) A where rownum<7

--select * from (select rownum rn,A.* from (select * from 表名) A where rownum<结束位置) where rn>开始位置

--结束位置=当前页*分页单位+1

--开始位置=(当前页-1)*分页单位

select * from (select rownum rn,A.* from (select * from emp) A where rownum<4) where rn>0 --第一页

select * from (select rownum rn,A.* from (select * from emp) A where rownum<7) where rn>3 --第二页

select * from (select rownum rn,A.* from (select * from emp) A where rownum<10) where rn>6 --第三页

--创建分页的存储过程(1.获取当前页的数据,2.总页数,3.总记录数)

--存储过程的参数(1.表名(in),2.当前页(in),3.分页单位(in),4.游标(out),5.总记录数(out),6.总页数(out))

--1.声明Ref游标类型

create or replace package xasxt as type my_cur_type is ref cursor; end;

--2.创建存储过程

create or replace procedure fenye(tableName in varchar2,curPage in number,pageSize in number, my_cur out xasxt.my_cur_type,totalRows out number ,totalPages out number) is

v_sql varchar2(200);-- 拼SQL语句 v_begin number;--开始位置 v_end number;--结束位置 begin

v_begin:=(curPage-1)*pageSize;--开始位置=(当前页-1)*分页单位

v_end:=curPage*pageSize+1;--结束位置=当前页*分页单位+1

v_sql:='select * from (select rownum rn,A.* from (select * from '||tableName||') A where rownum<'||v_end||') where rn>'||v_begin; open my_cur for v_sql;--打开游标

v_sql:='select count(*) from '||tableName;

execute immediate v_sql into totalRows ;--动态执行SQL if mod(totalRows,pageSize)=0 then --计算总页数 totalPages:=totalRows/pageSize; else

totalPages:=floor(totalRows/pageSize)+1; end if; end;

/*

jdbc调用分页存储过程

public static void main(String[] args) { try { Class.forName(\ Connection

conn

DriverManager.getConnection(\

CallableStatement csmt = conn.prepareCall(\ csmt.setString(1, \表名 csmt.setInt(2, 1);//当前页

csmt.setInt(3, 5);//分页单位

csmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); csmt.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); csmt.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); csmt.execute();

//获取输出参数

ResultSet rs = (ResultSet)csmt.getObject(4);//获取游标(查询出的数据) int totalRows = csmt.getInt(5);//总记录数 int totalPages = csmt.getInt(6);//总页数

System.out.println(\总记录数:\总页数:\ while(rs.next()){ int empno = rs.getInt(\

String ename = rs.getString(\

System.out.println(empno+\ }

rs.close(); csmt.close();

conn.close();

} catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace();

}

}

*/

select * from emp

=


Oracle笔记整理(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:金榜题名宴会致辞

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: