搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小蓝xlanll
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
【CSS】CSS特效集锦,视觉魔法的碰撞与融合(一)
2
会画画有什么用?_我要一个画画的布和画画的呗,谢谢你们,你们可以和我找一个吧。
3
github clone失败问题解决_github clone failed
4
ChatGPT人工智能对话系统源码 电脑版+手机端+小程序三合一 带完整的安装代码包以及搭建教程_chatgpt 源码下载
5
Windows电脑搭建HarmonyOS NEXTDeveloper Preview2环境详解_deveco studio next developer preview2
6
蓝易云 - 在Ubuntu环境下Nacos启动失败,Debug日志显示startup.sh: 130: startup.sh: [[: not found 的解决方案。
7
两万字长文 _ 面向不确定性环境的自动驾驶运动规划:机遇与挑战
8
安全左移利器——洞态iast调研(待完成)_洞态 iast
9
学习FPGA——LPM_COUNTER_lpmcounter aclr
10
音视频系列5: ffmpeg-python
当前位置:
article
> 正文
触发器与存储过程_存储过程插入数据是等执行完语句才触发插入动作吗?
作者:小蓝xlanll | 2024-06-07 04:01:51
赞
踩
存储过程插入数据是等执行完语句才触发插入动作吗?
触发器一 触发器介绍
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中
的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的
数据控制能力。数据库触发器有以下的作用:
* 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。
# 可以基于时间限制用户的操作,例如不允许下班后和节假日
修改数据库数据。
# 可以基于数据库中的数据限制用户的操作,例如不允许股票
的价格的升幅一次超过10%。
* 审计。可以跟踪用户对数据库的操作。
# 审计用户操作数据库的语句。
# 把用户对数据库的更新写入审计表。
* 实现复杂的数据完整性规则。
# 实现非标准的数据完整性检查和约束。触发器可产生比规则
更为复杂的限制。与规则不同,触发器可以引用列或数据库对
象。例如,触发器可回退任何企图吃进超过自己保证金的期货。
# 提供可变的缺省值。
* 实现复杂的非标准的数据库相关完整性规则。触发器可以对数
据库中相关的表进行连环更新。例如,在auths表author_code列上的
删除触发器可导致相应删除在其它表中的与之匹配的行。
# 在修改或删除时级联修改或删除其它表中的与之匹配的行。
# 在修改或删除时把其它表中的与之匹配的行设成NULL值。
# 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。
# 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试
图进行数据更新的事务。当插入一个与其主健不匹配的外部键
时,这种触发器会起作用。例如,可以在books.author_code
列上生成一个插入触发器,如果新值与auths.author_code列
中的某值不匹配时,插入被回退。
* 同步实时地复制表中的数据。
* 自动计算数据值,如果数据的值达到了一定的要求,则进行特
定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人
员发送警告数据。
ORACLE与SYBASE数据库的触发器有一定的区别,下面将分别讲述
这两种数据库触发器的作用和写法。
二 ORACLE 触发器
ORACLE产生数据库触发器的语法为:
create [or replace] trigger 触发器名 触发时间 触发事件
on 表名
[for each row]
pl/sql 语句
其中:
触发器名:触发器对象的名称。由于触发器是数据库自动执行
的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before---表示在数据库动作之前触发器执行;
after---表示在数据库动作之后出发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一
选项,则只对整个表执行一次。
举例:下面的触发器在更新表auths之前触发,目的是不允许在
周末修改表:
create trigger auth_secure
before insert or update or delete //对整表更新前触发
on auths
begin
if(to_char(sysdate,'DY')='SUN'
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
end if;
end
三 SYBASE数据库触发器
SYBASE数据库触发器的作用与ORACLE非常类似,仅有较小的差异。
SYBASE产生触发器的语法为:
CREATE TRIGGER 触发器名
ON 表名
FOR INSERT,UPDATE,DELETE
AS
SQL_statement |
FOR INSERT,UPDATE
AS
IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...
SQL_statements
上面FOR子句用来指定在触发器上的哪些数据更新命令可激活该
触发器。IF UPDATE子句检查对指定列的操作类型,在IF UPDATE子句
中可指定多个列。
与ORACLE不同,对于每条SQL语句,触发器只执行一次。触发器
在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一
个事务处理,事务可以在触发器中回退。
下面举例说明SYBASE触发器的写法。
create trigger forinsert_books
on books
for insert
as
if(select count(*) from auths,inserted
where auths.author_code=insert.author_code)!=@@rowcount
begin
rollback transaction
print "books 表中 author_code 列的值在auths 表中不存在。"
end
----------------------------------------------------------------------------------------------------------
存储过程一 存储过程介绍
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化
后存储在数据库服务器中,使用时只要调用即可。在ORACLE中,若干个
有联系的过程可以组合在一起构成程序包。
使用存储过程有以下的优点:
* 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可
以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的
运算。
* 可保证数据的安全性和完整性。
# 通过存储过程可以使没有权限的用户在控制之下间接地存取数据
库,从而保证数据的安全。
# 通过存储过程可以使相关的动作在一起发生,从而可以维护数据
库的完整性。
* 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出
了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。
由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执
行。
* 可以降低网络的通信量。
* 使体现企业规则的运算程序放入数据库服务器中,以便:
# 集中控制。
# 当企业规则发生变化时在服务器中改变存储过程即可,无须修改
任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运
算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序
工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的
运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可
以了,应用程序无须任何变化。
不同数据库存储过程的写法不一,在后面的讲座中将分别介绍ORACLE
和SYBASE存储过程的用法。
二 ORACLE 的存储过程
ORACLE 创建存储过程的语法为:
create [or replace] procedure 过程名
参数1 [in|out|in out] 数据类型
[,参数2 [in|out|in out] 数据类型]...
{is|as} pl/sql 语句
下面举例说明ORACLE数据库存储过程的写法和用法。
可以建立一个存储过程,每当用户修改数据库的重要数据时,即把
用户的用户名、日期和操作类型记录下来:
create procedure update_log is
begin
insert into update_log_tab(use_name,update_date,operation)
values(user,sysdate,'update'
end;
可以在恰当的位置调用这个存储过程来记录用户对表的修改。例如下面在
表sal_comm上建立一个修改触发器,每当用户修改此表后,用户的名称、修改
时间和操作即被记录在了表update_log_tab中:
create trigger audit_update
after update on sal_comm
for each row
begin
update_log
end
三 Sybase的存储过程
尽管Sybase存储过程的功能和写法与ORACLE类似,但他们之间还是
有一定的差别。下面讲述SYBASE的存储过程。
SYBASE可以用CREATE PROCedure命令生成存储过程:
CREATE PROCedure 存储过程名 [;number]
[[(] @parameter_name datatype [=default] [OUTput]
[, @parameter_name datatype [=default] [OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements
下面是一个查询作者编码、名称和生日的存储过程:
create proc p_auths @author_code varchar(10)
as
select author_code, name, birthdate
from auths
where author_code=@author_code
下面执行过程p_auths:
p_auths @author_code=A00001
在CREATE PROC语句中,可以为参数赋缺省值,该值可以是任何常量。
当用户不提供参数值时,该值便作为参数值提供给过程。
Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务。存储过程由SQL语句和流程控制语句组成。
它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调
用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。
存储过程的性能特
1.存储过程是预编译过的,这就意味着它与普通的SQL语句或批处理的SQL语句不同。当首次运行一个存储过程时,SQL Server的查询处理器对其进行分析,在排除了语法错误之后形成存储在系统中的可执行方案。由于查询处理的大部分工作已经完成,所以存储过程执行速度很 快。
2.存储过程和待处理的数据都放在同一台运行SQL Server的计算机上,使用存储过程查询当地的数据,效率自然很高。
3.存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。
4.存储过程还有着如同C语言子函数那样的被调用和返回值的方便特性。所以,存储过程大大增强了SQL语言的功能、效率和灵活性。掌握和应用好存储过程,对进一步发挥Sybase数据库系统的强大功能有着重要的意义。
存储过程的语法规则
建立存储过程的语法规则为:
CREATE PROCedure[owner.]procedurename[;number]
[[(]@parameter_name datatype[=default][OUTput]
[,@parameter_name datatype[=default][OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements
使用存储过程的语法规则为:
[EXECute][@return-status=]
[[[server.]database.]owner.]procedurename[;number]
[[@parameter_name=]value|[@parameter_name=]@varialbe[OUT put]
[,[@parameter_name=]value|[@parameter_name=]@variable[OU Tput]...]]
[WITH RECOMPILE]
下面简要介绍这两个命令的常用选项以及建立和使用存储过程的要点,关于选项的更为详细的说明请参考有关手册。
1.[[[server.]database.]owner.]procedure_name:存储过程的名字。
2.@parameter_name datatype[=default][OUTput]:形式参数(形参)的名称、类型。dfault是赋予的缺省值(可选),OUTput指定本参数为 输出参数(可选)。形参是存储过程中的自变量,可以有多个,名字必须以@打头,最长30个字符。
3.SQL_statements:定义存储过程功能的SQL语句。
4.@return_status:接受存储过程返回状态值的变量。
5.[@parameter_name=]value:实际参数(实参),@parameter_name 为实参的名称(可选)。如果某个实参以@parameter_name=value提供, 那么随后的实参也都要采用这一形式提供。
6.[@parameter_name=]@varialbe[OUTput]:将变量@varialbe中的值作为实参传递给形参@parameter_name(可选),如果变量@varialb e是用来接受返回的参数值,则选项OUTput不可缺少。
存储过程的建立和使用
我们将通过几个例子进行介绍。
假设有一个用下述语句生成的技能工资表RS_LS_GZ_JiNeng:
create table RS_LS_GZ_JiNeng /*技能工资表*/
(GeRen_id char(4), /*个人代码*/
RiQi smalldatetime, /*执行日期*/
YuanYin_id char(1) null, /*变动原因代码*/
JinE smallmoney) /*技能工资金额*/
该表存储着某单位员工多年来技能工资的历史档案。
例1.如果要查询全体员工的技能工资变动历史,则可先建立一个存储过程p_RsGz_JiNeng_All:
create procedure p_RsGz_JiNeng_All
as
select *
from RS_LS_GZ_JiNeng
order by GeRenid,RiQi
然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:
execute p_RsGz_JiNeng_All
本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。
例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:
create procedure p_RsGz_JiNeng
@c_GeRenId char(4)
as
select *from RS_LS_GZ_JiNeng
where GeRen_id=@c_GeRenId
order by RiQi
之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:
declare @GeRenId char(4)
select @GeRenId="0135" /*设要查询员工的个人代码为"0135" */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量。在调用该过程的批处理中,既可以用具体的值也可以用变量作 为实参。用变量作实参(如本例)时,必须用delare语句加以说明。注意,在批处理的调用过程语句@c_GeRenId=@GeRenId中的 @c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。
例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:
create procedure p_RsGz_JiNeng_Slt
(@c_GeRenId char(4),@sm_JinE smallmoney output)
as
select @sm_JinE=JinE
from RS_LS_GZ_JiNeng
where RiQi=(select max(RiQi)
from RS_LS_GZ_JiNeng
where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/
调用存储过程p_RsGz_JiNeng_Slt进行查询:
declare @GeRenId char(4),@JinE smallmoney
select @GeRenid="0135"/*设要查询员工的个人代码为"0135"*/
select @JinE=0
execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output
这里,变量@JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则, 变量@JinE将得不到形参传回的数值而始终为零(等于初值)。
例4.查到了个人代码为"0135"员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。
create procedure p_RsGz_JiNeng_Rtn
@c_GeRenId char(4)
as
declare @ErrCode smallint
select @ErrCode=0
if exists(select* from RS-LS-GZ-JiNeng
where GeRenid=@c-GeRenId)
begin
select *
from RS_LS_GZ_JiNeng
whrer GeRen_id=@c_GeRenId
order by RiQi
return @ErrCode
end
esle
begin
select @ErrCode=1
return @ErrCode
end
调用存储过程p_RsGz_JiNeng_Rtn:
declare @GeRenId char(4),@RtnCode smallint
select @GeRenId="0135"
select @RtnCode=0
execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId
if @RtnCode=1
print"No this one!"
存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrC ode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为"查无此人",返 回出错状态值1。否则,返回成功状态值0。
调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息"No this one!"。
小结
上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。
虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的, 但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统(如 PowerBuilder)的script语句中调用Sybase的存储过程也非常普遍
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小蓝xlanll/article/detail/683865
推荐阅读
article
一元
线性
回归
-
python
代码
_
线性
回归
代码
python
...
一元
线性
回归
_
线性
回归
代码
python
线性
回归
代码
python
...
赞
踩
article
基于
MyEclipse
+
Tomcat
+Mysql+JSP开发得基于网络
爬虫
技术的
网络新闻
分析_mye...
基于网络
爬虫
技术的
网络新闻
分析主要用于网络数据爬取。本系统结构如下:(1)网络
爬虫
模块。(2)中文分词模块。(3)中3文...
赞
踩
article
Android
LAME
原生
音频
_安卓原生
音视频
...
我想大家都做过录音的功能吧,首先想到的是不是MediaRecorder?今天我们不用MediaRecorder,而是使用...
赞
踩
article
【长文预警】
美团
联合
创始人
王慧文
清华
产品
课
...
公司战略、
产品
策略、运营策略_
王慧文
清华
产品
课
王慧文
清华
产品
课
...
赞
踩
article
A
*
算法
原理及
C++
实现_
c++
a
*...
A
*
算法
是一种全局路径规划
算法
,根据起点和终点在地图上进行路径规划,用于导航中计算机器人到目标位置的最优路线。
c++
a
...
赞
踩
article
我
的
书签菜单_
聚
bt
...
Inoreader - The content reader for power users who want to s...
赞
踩
article
福州大学
acm
_
福州大学
acm
题库...
昨天在
福州大学
acm
,a了几道题,很类似,有几道,都是用指数模算法,性能超好。1586题Ones again,求1的位数...
赞
踩
article
Ambari
告警无法显示,后台空指针异常_
ambari
java
.
lang
.nullpointere...
AlertCurrentEntity拿着alert_current (history_id)去匹配alert_histo...
赞
踩
article
匿名
内部
类
的
传参
_
匿名
内部
类
可以
传参
吗...
把
匿名
内部
类
里德值传出去,不能直接赋值,只能用set方法_
匿名
内部
类
可以
传参
吗
匿名
内部
类
可以
传参
吗 ...
赞
踩
article
HiWoo
Cloud
物
联网
云平台...
在科技日新月异的今天,物
联网
(IoT)已经成为推动社会进步的重要力量。而物
联网
云平台,作为连接万物、实现智能交互的核心,...
赞
踩
article
Android
之
音频
和
视频
的提取_
android
提取
视频
音频
...
Android
之
音频
和
视频
的提取权限
android:name="
android
.per...
赞
踩
article
数据结构
——
链表
OJ题_
python
删除
链表
中所有满足
node
.
val
=
=
val
的
节点
,返回...
链表
oj题练习,
链表
尾插,我们可以用一个tail指针来记录尾插后的
节点
,尾插直接在tail
节点
后即可,这样就不用每次尾插...
赞
踩
article
聚类
算法- K
means
and
DBSCAN
_
聚类
.随机生成
数据
用来
分类
; 2.对
分类
数据
进行标准...
基础知识:【转载】:深入理解K-Means
聚类
算法 _ 转自:CSDNyqtaowhu【转载】:第十三篇:K-Means...
赞
踩
article
Vue项目截图
,
谷歌浏览器
下载
本地
或者
另存为
到对应的文件夹_
vue
实现
下载
另存为
功能...
然后仔细查了showSaveFilePicker这个api
,
发现这个东西只支持https和
本地
开发
,
科学上网之后也没找到...
赞
踩
article
python
机器
学习
之
NLP
要
理解透的知识_
python
nlp
...
python
机器
学习
之
NLP
要
理解透的知识_
python
nlp
python
nlp
一、LS...
赞
踩
article
程序员
垃圾
简历
长
什么样
?
_
公司
爬虫项目可以写在
简历
上吗...
已经连续五年参加大厂校招、社招的技术面试工作,
简历
看的不下于万份这篇文章会用实例告诉你,什么是差的
程序员
简历
!疫情快要结...
赞
踩
article
android
约束布局
ConstraintLayout
_
constraintlayout
比例
...
https://www.jianshu.com/p/28bc3619fc82_
constraintlayout
比例
co...
赞
踩
article
Linux中
nmcli
命令
详解...
Linux中
nmcli
命令
的使用_
nmcli
命令
详解
nmcli
命令
详解 ...
赞
踩
article
求职
简历
(
精选
20
篇)...
时间:
20
xx.9-
20
xx.12 公司名称:幻主
简历
公司1 职位名称:店长 负责销售卖场的日常销售管理,营造良好的销售...
赞
踩
article
【
金融
科技前沿】
金融
实人
认证
+基于
百度
AI的
身份证
图片批量
OCR
识别
_
识别
是否为真实
身份证
金融
...
文章目录
金融
实人
认证
实人
认证
整体介绍
实人
认证
的产品架构意愿性表达证件
OCR
证件NFC分级活体图片内容标签
识别
实人
认证
的产...
赞
踩
相关标签
python
线性回归
tomcat
mysql
java
android
音视频
其他
算法
A星
区块链
ambari
大数据
运维
匿名内部类
物联网
物联网云平台
数据结构
链表
k-means
vue.js
javascript
前端
机器学习
人工智能