温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-08-09 08:35:14 来源:ITPUB博客 阅读:139 作者:blt32034 栏目:关系型数据库

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;

 


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI