千家信息网

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

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,一:存储过程 ( 图片左边的 procedure 目录 ) :在数据库的实际开发过程中,我们不可能每个脚本用人工的方式执行,需要自动的批量提交脚本到数据库执行,数据库就提供了像存储过程这样的对象,方便
千家信息网最后更新 2024年09月22日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