设为首页 收藏本站
查看: 979|回复: 0

[经验分享] Oracle-day04 下

[复制链接]

尚未签到

发表于 2018-9-5 10:41:35 | 显示全部楼层 |阅读模式
  三、存储过程
  (一)什么是存储过程
  存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。应用程序可以调用存储过程,执行相应的逻辑。
  存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:
  1、存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
  2、存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
  3、存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。
  (二)存储过程语法结构
  创建或修改存储过程的语法如下:
  

  
CREATE [ OR REPLACE ] PROCEDURE
  
存储过程名称
  
(参数名 类型, 参数名 类型, 参数名 类型)
  
IS|AS
  
变量声明部分;
  

  
BEGIN
  
逻辑部分
  
[EXCEPTION
  
异常处理部分]
  
END;
  
参数只指定类型,不指定长度
  
过程参数的三种模式:
  
IN 传入参数(默认)
  
OUT 传出参数 ,主要用于返回程序运行结果
  
IN OUT 传入传出参数
  

(三)案例
  1.创建不带传出参数的存储过程:添加业主信息
  

-增加业主信息序列create sequence seq_owners start with 11;  
--增加业主信息存储过程
  
create or replace procedure pro_owners_add
  
(
  
v_name varchar2,
  
v_addressid number,
  
v_housenumber varchar2,
  
v_watermeter varchar2,
  
v_type number
  
)
  
is
  
begin
  

  
insert into T_OWNERS
  
values( seq_owners.nextval,v_name,v_addressid,v_housenumb
  
er,v_watermeter,sysdate,v_type );
  
commit;
  
end;
  

  PL/SQL 中调用存储过程
  call pro_owners_add('赵伟',1,'999-3','132-7',1);
  JDBC 调用存储过程
  

  
/**
  
* 增加
  
* @param owners
  
*/
  
public static void add(Owners owners){
  
java.sql.Connection conn=null;
  
java.sql.CallableStatement stmt=null;
  
try {
  
conn=BaseDao.getConnection();
  
stmt=conn.prepareCall("{call
  
pro_owners_add(?,?,?,?,?)}");
  
stmt.setString(1, owners.getName());
  
stmt.setLong(2, owners.getAddressid());
  
stmt.setString(3, owners.getHousenumber());
  
stmt.setString(4, owners.getWatermeter());
  
stmt.setLong(5, owners.getOwnertypeid());
  
stmt.execute();
  
} catch (SQLException e) {
  
e.printStackTrace();
  
}finally {
  
BaseDao.closeAll(null, stmt, conn);
  
}
  
}
  

2创建带传出参数的存储过程

  需求:添加业主信息,传出参数为新增业主的>  

-增加业主信息存储过程create or replace procedure pro_owners_add  
(
  
v_name varchar2,
  
v_addressid number,
  
v_housenumber varchar2,
  
v_watermeter varchar2,
  
v_type number,
  
v_id out number
  
)
  
is
  
begin
  
select seq_owners.nextval into v_id from dual;
  
insert into T_OWNERS
  
values( v_id,v_name,v_addressid,v_housenumber,v_watermete
  
r,sysdate,v_type );
  
commit;
  
end;
  

  PL/SQL 调用该存储过程
  

declare  
v_id number;--定义传出参数的变量
  
begin
  
pro_owners_add('王旺旺',1,'922-3','133-7',1,v_id);
  
DBMS_OUTPUT.put_line('增加成功,ID:'||v_id);
  
end;
  

  执行成功后输出结果:
DSC0000.jpg

  JDBC 调用存储过程
  

  
/**
  
* 增加
  
* @param owners
  
*/
  
public static long add(Owners owners){

  
long>  
java.sql.Connection conn=null;
  
java.sql.CallableStatement stmt=null;
  
try {
  
conn=BaseDao.getConnection();
  
stmt=conn.prepareCall("{call
  
pro_owners_add(?,?,?,?,?,?)}");
  
stmt.setString(1, owners.getName());
  
stmt.setLong(2, owners.getAddressid());
  
stmt.setString(3, owners.getHousenumber());
  
stmt.setString(4, owners.getWatermeter());
  
stmt.setLong(5, owners.getOwnertypeid());
  
stmt.registerOutParameter(6, OracleTypes.NUMBER);//注
  
册传出参数类型
  
stmt.execute();
  
id=stmt.getLong(6);//提取传出参数
  
} catch (SQLException e) {
  
e.printStackTrace();
  
}finally {
  
BaseDao.closeAll(null, stmt, conn);
  
}

  
return>  
}
  

  四、触发器
  (一)什么是触发器
  数据库触发器是一个与表相关联的、存储的 PL/SQL 程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle 自动地执行触发器中定义的语句序列。
  触发器可用于
  l 数据确认
  l 实施复杂的安全性检查
  l 做审计,跟踪表上所做的数据操作等
  l 数据的备份和同步
  触发器分类
  l 前置触发器(BEFORE)
  l 后置触发器(AFTER)
  (二)创建触发器的语法
  语法:
  

CREATE [or REPLACE] TRIGGER 触发器名  
BEFORE | AFTER
  
[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
  
ON 表名
  
[FOR EACH ROW ][WHEN(条件) ]
  
declare
  
……
  
begin
  
PLSQL 块
  
End ;
  

  FOR EACH ROW 作用是标注此触发器是行级触发器
  语句级触发器
  在触发器中触发语句与伪记录变量的值
DSC0001.jpg

  (三)案例
  1.前置触发器
  需求:当用户输入本月累计表数后,自动计算出本月使用数 。
  代码:
  

create or replace trigger tri_account_updatenum1  
before
  
update of num1
  
on t_account
  
for each row
  
declare
  
begin
  
:new.usenum:=:new.num1-:new.num0;
  
end;
  

2.后置触发器
  需求:当用户修改了业主信息表的数据时记录修改前与修改后的值
  

-创建业主名称修改日志表:用于记录业主更改前后的名称create table t_owners_log  
(
  
updatetime date,
  
ownerid number,
  
oldname varchar2(30),
  
newname varchar2(30)
  
);
  
--创建后置触发器,自动记录业主更改前后日志
  
create trigger tri_owners_log
  
after
  
update of name
  
on t_owners
  

  
for each row
  
declare
  
begin
  
insert into t_owners_log
  
values(sysdate,:old.id,:old.name,:new.name);
  
end;
  

  测试:
  

--更新数据
  
update t_owners set name='杨小花' where>  
commit;
  
--查询日志表
  
select * from t_owners_log;
  

  五、综合案例
  1.编写 PL/SQL,用水吨数 12吨,业主类型为 1,计算阶梯水费。
  思路分析:
  水费是实行阶梯计算的,我们查询价格表中业主类型为 1 的水费价格记录
DSC0002.jpg

  minnum 为下限值 ,maxnum 为上限值。上边的记录的含义是
  5 吨以下的价格为 2.45
  超过 5 吨不足 10 吨的价格为 3.45
  超过 10 吨以上的价格为 4.45
  如果吨数为 12。计算如下:
DSC0003.jpg

  考虑到阶梯的层次可能是不确定的,所以我们需要通过游标查询出阶梯价格记录,然后计算每一阶梯的水费,然后相加。伪代码如下:
  

金额=0  
循环价格表{
  
if( 上限值为空 或者 总吨数  

  
v_usenum2 number(10,2);--总吨数
  
v_money number(10,2);--总金额
  
cursor cur_pricetable(v_type number) is select * from
  
t_pricetable where ownertypeid=v_type;--价格游标
  
v_pricetable t_pricetable%rowtype;--每阶梯价格对象
  
begin
  
v_ownertypeid:=1;
  
v_usenum2:=12;
  
v_money:=0;
  
for v_pricetable in cur_pricetable(v_ownertypeid)
  
loop
  
if v_pricetable.maxnum is null or
  
v_usenum2

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-563480-1-1.html 上篇帖子: Oracle-day04 中 下篇帖子: Oracle dbms_xplan
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表