ITPub博客

首页 > 数据库 > Oracle > 13-oracle_数据库存储过程和包的开发

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

原创 Oracle 作者:blt32034 时间:2019-05-04 11:11:14 0 删除 编辑

一:存储过程 ( 图片左边的 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;

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31535951/viewspace-2643211/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 12-oracle_分区
请登录后发表评论 登录
全部评论
在快递和物流行业深耕多年,有丰富的行业经验和解决方案。

注册时间:2018-05-07

  • 博文量
    46
  • 访问量
    56101