欢迎光临
我们一直在努力

13-oracle_数据库存储过程和包的开发


一:存储过程


(


图片左边的


procedure


目录


)




在数据库的实际开发过程中,我们不可能每个脚本用人工的方式执行,需要自动的批量提交脚本到数据库执行,数据库就提供了像存储过程这样的对象,方便开发人员把处理某个功能或报表的逻辑写到存储过程里。

1)

存储过程的优点:

a.

执行速度更快:在数据库中保存的存储过程语句都是编译过的

b.

允许模块化程序设计和可移植性更强:类似方法的复用(使用存储过程可以实现存储过程设计和编码工作的分开进行,只要将存储过程名、参数、返回信息等告诉编程人员即可);

c.

提高系统安全性:防止

SQL

注入

 

(执行存储过程的用户要具有一定的权限才能使用存储过程)

d.

减少网络流通量:只要传输存储过程的名称(在大批数据查询时使用存储过程分页查询比其他方式的分页要快很多)

e.

在同时进行逐主、从表间的数据维护及有效性验证时,使用存储过程更加方便,可以有效的利用

SQL

中的事务处理机制。


创建存储

2)

创建语法:


create


or


replace


procedure


p_house_create_data(p_fm_dt


date


default


sysdate





1


,


                                                p_to_dt


date


default


sysdate


)


is


 



/************************************************************



    author    :hf



    created   :2018-08-08



    purpose   :




生成数据过程



    parameter        value



    p_fm_dt          2018-08-01(




昨天




)



    p_to_dt          2018-08-02(




当日




)



  *************************************************************/


 



/************************************************************



   




定义区间



  *************************************************************/


  v_sqlstate   


varchar2


(


500


);


  v_proc_name  


varchar2


(


64


) :=


'p_house_create_data'


;


  v_fm_dt      


date


;


  v_to_dt      


date


;


begin


 



/************************************************************



   




赋值区间



  *************************************************************/


  v_sqlstate :=


'


赋值


'


;


  v_fm_dt    :=


trunc


(p_fm_dt,


'DD'


);


  v_to_dt    :=


trunc


(p_to_dt,


'DD'


);


 



/************************************************************



   




计算区间



  *************************************************************/


  v_sqlstate :=


'


开始


'


;


  pkg_rpt_system.sys_log(v_proc_name, v_sqlstate,


'OK'


,


null


,


null


);








写日志


  v_sqlstate :=


'


删除数据


'


;


 


delete


t_landlord;


 


commit


;


 


  v_sqlstate :=


'


生成房东信息数据


'


;


 


insert


into


t_landlord


 


values


    (


'001'


,


'


张强


'


,


'





'


,


'13723870069'


,


'001'


,


'2010-03-12'


);


 


commit


;


 



/************************************************************



   




结束区间



  *************************************************************/


  v_sqlstate :=


'


结束


'


;


  pkg_rpt_system.sys_log(v_proc_name, v_sqlstate,


'OK'


,


null


,


null


);








写日志


 



/************************************************************



   




异常区间



  *************************************************************/


exception


 


when


others


then


   


rollback


;








回滚数据


    pkg_rpt_system.sys_log(v_proc_name,


                           v_sqlstate,


                          


'ERROR'


,


                          


sqlcode


,


                          


substr


(


sqlerrm


,


1


,


3000


));








写日志


   


commit


;


end


p_house_create_data;

 


二:包


(


图片左边的


package bodies


目录


)




其实包可以理解为是对存储过程和函数的方便管理,如果过程和函数多了,不方便查找,比较乱,哪么我们可以把相关的过程放在一起,或把业务逻辑相关的放在一起维护。

1)

包的构成:

a.

包头:是对包里的过程和函数的一个定义,相关于目录

b.

包体:是对包里的过程和函数的实现,具体代码的逻辑实现。

2)

创建语法:








包头


create


or


replace


package


pkg_abc_create_data


is


 


procedure


p_house_create_data(p_fm_dt


date


default


sysdate





1


,


                                p_to_dt


date


default


sysdate


);


end


pkg_abc_create_data;

 








包体


create


or


replace


package


body


pkg_abc_create_data


is


 


 


procedure


p_house_create_data(p_fm_dt


date


default


sysdate





1


,


                                p_to_dt


date


default


sysdate


)


is


   



/************************************************************



      author    :hf



      created   :2018-08-08



      purpose   :




生成数据过程



      parameter        value



      p_fm_dt          2018-08-01(




昨天




)



      p_to_dt          2018-08-02(




当日




)



    *************************************************************/


   



/************************************************************



     




定义区间



    *************************************************************/


    v_sqlstate 


varchar2


(


500


);


    v_proc_name


varchar2


(


64


) :=


'p_house_create_data'


;


    v_fm_dt    


date


;


    v_to_dt    


date


;


 


begin


   



/************************************************************



     




赋值区间



    *************************************************************/


    v_sqlstate :=


'


赋值


'


;


    v_fm_dt    :=


trunc


(p_fm_dt,


'DD'


);


    v_to_dt    :=


trunc


(p_to_dt,


'DD'


);


   



/************************************************************



     




计算区间



    *************************************************************/


    v_sqlstate :=


'


开始


'


;


    pkg_rpt_system.sys_log(v_proc_name, v_sqlstate,


'OK'


,


null


,


null


);


    v_sqlstate :=


'


删除数据


'


;


   


delete


t_landlord;


   


commit


;


    v_sqlstate :=


'


生成房东信息数据


'


;


   


insert


into


t_landlord


   


values


      (


'001'


,


'


张强


'


,


'





'


,


'13723870069'


,


'001'


,


'2010-03-12'


);


   


commit


;


   



/************************************************************



     




结束区间



    *************************************************************/


    v_sqlstate :=


'


结束


'


;


    pkg_rpt_system.sys_log(v_proc_name, v_sqlstate,


'OK'


,


null


,


null


);


   



/************************************************************



     




异常区间



    *************************************************************/


 


exception


   


when


others


then


     


rollback


;


      pkg_rpt_system.sys_log(v_proc_name,


                             v_sqlstate,


                            


'ERROR'


,


                            


sqlcode


,


                            


substr


(


sqlerrm


,


1


,


3000


));


     


commit


;


 


end


p_house_create_data;


end


pkg_abc_create_data;

 

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。