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;

更多技术文章请关注公众号(长按后点识别图中二维码):

猜你喜欢

转载自blog.csdn.net/u012667253/article/details/89811666
今日推荐