存储过程的实例

发布网友 发布时间:2022-04-23 13:21

我来回答

2个回答

懂视网 时间:2022-04-30 03:40

create or replace procedure p_do_staff_qualify(i_get_type in varchar2,
i_org_no in varchar2,
i_staff_no in varchar2,
i_apply_occu_id in varchar2,
iapply_occu_name in varchar2,
i_apply_work_type_id in varchar2,
i_apply_work_type_name in varchar2,
i_apply_title_id in varchar2,
i_apply_title_name in varchar2,
i_create_user_id in varchar2,
o_rtnstr out varchar2,
o_rtninfo out varchar2) is
----邵松
--i_org_no 登录人所在机构编码
--i_get_type 操作动作
--i_staff_no 人员编码
--i_apply_occu_id 申请职业编码
--i_apply_work_type_id 申请监考工种编码
--i_apply_title_id 申请职称编码
--i_create_user_id 创建人员编码

v_num int := 0;
v_ber int := 0;
v_org_level varchar2(100);
begin
o_rtnstr := ‘false‘;
o_rtninfo := ‘操作失败‘;
if i_create_user_id = ‘‘ or i_create_user_id is null then
o_rtninfo := ‘非法用户‘;
return;
end if;

select count(*)
into v_num
from t_f_user t
where t.user_id = i_create_user_id
and t.is_valid = ‘0‘;

if v_num < 1 then
o_rtninfo := ‘不存在的操作用户‘;
return;
end if;
select org_level into v_org_level from t_f_org where org_no = i_org_no;
------- 考评员操作
--考评员资格申请
if v_org_level = ‘3‘ then
if i_get_type = ‘staff‘ then
select count(*)
into v_ber
from t_f_staff_qualify
where staff_no = i_staff_no
and apply_occu_id = i_apply_occu_id
and apply_work_type_id = i_apply_work_type_id
and apply_title_id = i_apply_title_id;
if v_ber >= 1 then
o_rtninfo := ‘该员工以有该职业考评员资格‘;
elsif v_ber < 1 then

insert into t_f_staff_qualify
(staff_no,
apply_occu_id,
apply_occu_name,
apply_work_type_id,
apply_work_type_name,
apply_title_id,
apply_title_name,
verify_state,
create_time,
create_user_id)
values
(i_staff_no,
i_apply_occu_id,
iapply_occu_name,
i_apply_work_type_id,
i_apply_work_type_name,
i_apply_title_id,
i_apply_title_name,
‘00‘,
sysdate,
i_create_user_id);
commit;
o_rtninfo := ‘该员工申请成功!‘;


end if;
end if;

elsif v_org_level = ‘2‘ then
-- 鉴定中心审核对考评员资格进行审核
--通过鉴定中心审核
if i_get_type = ‘verifyIsPass‘ then
update t_f_staff_qualify
set verify_state = ‘10‘,
verify_opinion_2 = ‘通过‘,
verify_time_2 = sysdate
where verify_state = ‘00‘
and staff_no = i_staff_no
and apply_occu_id = i_apply_occu_id
and apply_work_type_id = i_apply_work_type_id
and apply_title_id = i_apply_title_id;
commit;
o_rtninfo := ‘鉴定中心审核通过‘;

--没通过鉴定中心审核
elsif i_get_type = ‘verifyIsUnPass‘ then
update t_f_staff_qualify
set verify_state = ‘11‘,
verify_opinion_2 = ‘所学专业不符‘,
verify_time_2 = sysdate
where verify_state = ‘00‘
and staff_no = i_staff_no
and apply_occu_id = i_apply_occu_id
and apply_work_type_id = i_apply_work_type_id
and apply_title_id = i_apply_title_id;
commit;
o_rtninfo := ‘鉴定中心审核没通过‘;
end if;
elsif v_org_level = ‘1‘ then
-- 鉴定指导中心审核对考评员资格进行审核
--通过鉴定指导中心审核
if i_get_type = ‘verifyIsPass‘ then
update t_f_staff_qualify
set verify_state = ‘20‘,
verify_opinion_1 = ‘通过‘,
verify_time_1 = sysdate
where verify_state = ‘10‘
and staff_no = i_staff_no
and apply_occu_id = i_apply_occu_id
and apply_work_type_id = i_apply_work_type_id
and apply_title_id = i_apply_title_id;
commit;
o_rtninfo := ‘鉴定指导中心审核通过‘;

--没通过鉴定指导中心审核
elsif i_get_type = ‘verifyIsUnPass‘ then
update t_f_staff_qualify
set verify_state = ‘21‘,
verify_opinion_1 = ‘所学专业不符‘,
verify_time_1 = sysdate
where verify_state = ‘10‘
and staff_no = i_staff_no
and apply_occu_id = i_apply_occu_id
and apply_work_type_id = i_apply_work_type_id
and apply_title_id = i_apply_title_id;
commit;
o_rtninfo := ‘鉴定指导中心审核没通过‘;

end if;
else
o_rtninfo := ‘用户等权限太低,不能操作!‘;
end if;
commit;


---------网管操作
--网管员资质申请

if v_org_level = ‘3‘ then
if i_get_type = ‘webmaster‘ then
select count(*)
into v_ber
from t_f_staff_qualify
where staff_no = i_staff_no
and apply_title_id = ‘004‘;
if v_ber >= 1 then
o_rtninfo := ‘该员工已经是网络管理员!‘;
elsif v_ber < 1 then

insert into t_f_staff_qualify
(staff_no,
apply_title_id,
apply_title_name,
verify_state,
create_time,
create_user_id)
values
(i_staff_no,
i_apply_title_id,
i_apply_title_name,
‘0‘,
sysdate,
i_create_user_id);
commit;
o_rtninfo := ‘该员工申请成功!‘;


end if;
end if;

elsif v_org_level = ‘2‘ then
-- 鉴定中心对网管员资质进行审核
--通过鉴定中心审核
if i_get_type = ‘webmasterIsPass‘ then
update t_f_staff_qualify
set verify_state = ‘1‘,
verify_opinion_2 = ‘通过‘,
verify_time_2 = sysdate
where verify_state = ‘0‘
and staff_no = i_staff_no;
commit;
o_rtninfo := ‘鉴定中心审核通过‘;

--没通过鉴定中心审核
elsif i_get_type = ‘webmasterIsUnPass‘ then
update t_f_staff_qualify
set verify_state = ‘2‘,
verify_opinion_2 = ‘文化程度太低‘,
verify_time_2 = sysdate
where verify_state = ‘0‘
and staff_no = i_staff_no;
commit;
o_rtninfo := ‘鉴定中心审核没通过‘;
end if;
elsif v_org_level = ‘1‘ then
-- 鉴定指导中心对网管员资质进行审核
--通过鉴定指导中心审核
if i_get_type = ‘webmasterIsPass‘ then
update t_f_staff_qualify
set verify_state = ‘3‘,
verify_opinion_1 = ‘通过‘,
verify_time_1 = sysdate
where verify_state = ‘1‘
and staff_no = i_staff_no;
commit;
o_rtninfo := ‘鉴定指导中心审核通过‘;

--没通过鉴定指导中心审核
elsif i_get_type = ‘webmasterIsUnPass‘ then
update t_f_staff_qualify
set verify_state = ‘4‘,
verify_opinion_1 = ‘文化程度太低‘,
verify_time_1 = sysdate
where verify_state = ‘1‘
and staff_no = i_staff_no;
commit;
o_rtninfo := ‘鉴定指导中心审核没通过‘;

end if;
else
o_rtninfo := ‘用户等权限太低,不能操作!‘;
end if;
commit;
end p_do_staff_qualify;

数据库存储过程范例

标签:

热心网友 时间:2022-04-30 00:48

数据库存储过程
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下:
CREATE PROC[EDURE] procere_name [;number]
[
{@parameter data_type} ][VARYING] [= default] [OUTPUT]
]
[,...n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE, ENCRYPTION
}
]
[FOR REPLICATION]
AS
sql_statement [...n]
[ ]内的内容是可选项,而()内的内容是必选项,
例:若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为:
Create Proc select_del As
Delete tmp
例:用户想查询tmp表中某年的数据的存储过程
create proc select_query @year int as
select * from tmp where year=@year
在这里@year是存储过程的参数
例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。
空:表示该结点为顶层结点
fjdid(父结点编号)
结点n 非空:表示该结点的父亲结点号
dwmc(单位名称) CREATE proc search_dwmc@dwidoldint,@dwmcresult varchar(100) outputasdeclare @stopintdeclare @result varchar(80)declare @dwmc varchar(80)declare @dwidintset nocountonset @stop=1set @dwmc=""select @dwmc = dwmc, @dwid = convert(int,fjdid) from jtdw where id = @dwidoldset @result = rtrim(@dwmc)if @dwid = 0set @stop = 0while(@stop = 1)and(@dwid<>0)beginset @dwidold = @dwidselect @dwmc = dwmc, @dwid = convert(int,fjdid) from jtdw where id = @dwidoldif @@rowcount = 0set @dwmc = ""elseset @result= @dwmc + @resultif(@dwid = 0) or (@@rowcount = 0)set @stop = 0elsecontinueendset @dwmcresult = rtrim(@result)使用execpro-name[pram1pram2.....]SQL Server中存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出订单编号为1的订单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。
Oracle中的存储过程
1.创建过程
与其它的数据库系统一样,Oracle的存储过程是用PL/SQL语言编写的能完成一定处理功能的存储在数据库字典中的程序。
语法:
create [or replace] procere procere_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<类型.变量的说明>
(注:不用 declare语句 )
Begin
<执行部分>
exception
<可选的异常处理说明>
end;
1.1 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;
1.2 在存储过程内的参数只能指定参数类型;不能指定长度;
1.3 在AS或IS 后声明要用到的变量名称和变量类型及长度;
1.4 在AS或IS 后声明变量不要加declare 语句。
2.使用过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、Oracle开发工具或第三方开发工具来调用运行。Oracle 使用CALL 语句来实现对存储过程的调用。
语法:
call procere_name( parameter1, parameter2…);
3.开发过程
如今的几大数据库厂商提供的编写存储过程的工具都没有统一,虽然它们的编写风格有些相似,但由于没有标准,所以各家的开发调试过程也不一样。下面编写PL/SQL存储过程、函数、包及触发器的步骤如下:
3.1 编辑存储过程源码使用文字编辑处理软件编辑存储过程源码,要用类似WORD文字处理软件进行编辑时,要将源码存为文本格式。
3.2 对存储过程程序进行解释在SQLPLUS或用调试工具将 存储过程程序进行解释;
在SQL>下调试,可用start 或get 等Oracle命令来启动解释。如:
SQL>start c:\stat1.sql
如果使用调试工具,可直接编辑和点击相应的按钮即可生成存储过程。
3.3 调试源码直到正确我们不能保证所写的存储过程达到一次就正确。所以这里的调试是每个程序员必须进行的工作之一。在SQLPLUS下来调试主要用的方法是:
1.使用 SHOW ERROR命令来提示源码的错误位置;
2.使用 USER_ERRORS数据字典来查看各存储过程的错误位置。
3.4 授权执行权给相关的用户或角色如果调试正确的存储过程没有进行授权,那就只有建立者本人才可以运行。所以作为应用系统的一部分的存储过程也必须进行授权才能达到要求。 在SQLPLUS下可以用GRANT命令来进行存储过程的运行授权。
语法:
GRANT system_privilege | role TO user | role | PUBLIC
[WITH ADMIN OPTION]

GRANT object_privilege | ALL column ON schema.object
TO user | role | PUBLIC WITH GRANT OPTION
其中
system_privilege: 系统权限
role: 角色名
user: 被授权的用户名
object_privilege: 所授予的权限名字,可以是
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
Column: 列名
schema: 模式名
object: 对象名
4.数据字典
USER_SOURCE 用户的存储过程、函数的源代码字典
DBA_SOURCE 整个系统所有用户的存储过程、函数的源代码字典
ALL_SOURCE 当前用户能使用的存储过程(包括其她用户授权)、函数的源代码字典
USER_ERRORS 用户的存储过程、函数的源代码存在错误的信息字典
临时表
(针对SQL2000/2005)
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。
SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。
除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
所有其它本地临时表在当前会话结束时自动除去。
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com