❶ ORA-03113 通信通道的文件结束!求助!
str_content varchar2(200);
count0 number(10);
count1 number(10);
BEGIN
str_content:=substr(CONTENT,1,1);
if str_content = 'B' or str_content = '搜宴b' then
count0:=0;
count1:=0;
这个好闷纯像是中毒蚂漏咐了吧!!
❷ 存储过程和触发器有什么不同
首先介绍一下触发器:
触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 sql 语句。它们主要用于强制复杂的业务规则或要求。例如,可以控制是否允许基于顾客的当前帐户状态插入定单。
触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。有关详细信息,请参见表关系。
使用触发器的优点
触发器的优点如下:
触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。
触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。
再介绍存储过程:
存储过程(Stored Procere)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。总的来说,存储过程具有以下一些优点:
◆存储过程允许标准组件式编程
◆存储过程能够实现较快的执行速度
◆存储过程能够减少网络流量
◆存储过程可被作为一种安全机制来充分利用
使用 SQL Server 中的存储过程而不使用存储在客户计算机本地的 Transact-SQL 程序的优势有:
允许模块化程序设计。
只需创建过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改。
允许更快执行。
如果某操作需要大量 Transact-SQL 代码或需重复执行,存储过程将比 Transact-SQL 批代码的执行要快。将在创建存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。每次运行 Transact-SQL 语句时,都要从客户端重复发送,并且在 SQL Server 每次执行这些语句时,都要对其进行编译和优化。
减少网络流量。
一个需要数百行 Transact-SQL 代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。
可作为安全机制使用。
即使对于没有直接执行存储过程中语句的权限的用户,也可授予他们执行该存储过程的权限
❸ SQL中触发器、存储过程
1、触发器:当向表unit插入的数据后,且objectid>10000时,向表test_tab插入数据
create
trigger
trig1
after
insert
on
unit
for
each
row
when
(objectid>10000)
begin
insert
into
test_tab
values(new.objectid,new.name);
end;存储过程:向表test插入调用存储时的参数@id,@namecreate
procere
pro_name
@id,@nameasbegininsert
into
test
values(@id,@name);end;2、两个区别,通过语法可以看出来,触发器是在执行了一定的操作后,根据触发条件,系统自动执行某一操作;而存储过程则是根据你设定的特定操作,来进行相应的操作而已。3、至于什么时候用触发器,什么时候用存储过程,这个就要根据你的使用情况了。比如说,在对某张表进行了特定操作后,我们让系统自动去执行一些操作,这个时候就可以使用触发器。而存储过程呢,如果我们在某一个事务中要进行的sql操作特别多,那么我们就可以把这些sql语句用存储过程来汇总,达到执行一遍存储过程就可以执行多条sql命令的目的。另外,你听说的现在不用触发器,这点明显是被误导了,触发器和存储过程是各有优点的。举个例子,比如说电信的通话记录,你可以想象每天的数据量有多大,那么为了保证系统的性能,我们就可以设定触发器来对表的容量进行限定,比如达到了1000万条数据,我们可以触发一个清表的操作,那么这张表就可以保证数据量始终在1000W以下(这个例子不是很合适,但是可以说明点问题)。之所以有人说不用触发器,这点也是从数据库性能来说的,说实话,使用触发器时,如果设计得不合适,那么对整个系统的性能会造成很大的影响的,所以在设计数据库时,一定要慎重。整个产品的性能并不是说代码优化就行了,数据库的架构设计也应该考虑在其中。
❹ 存储过程和触发器的区别和联系。
我的理解:主要是使用场合不同,还有就是触发器中不能使用commit(这个应该是约定而不是规定)
存储过程相当于打包好的sql语法,可以包含复杂的sql操作,在程序调用时只要执行该存储过程,一句话就可以完成复杂的数据库操作.
触发器是也是打包好的sql语法,是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行
另外:触发器相对一般的存储过程也多了一些在代码编写方面的不同,比如说create
trigger
必须是批处理中的第一条语句,并且只能应用到一个表中等等.具体的可以看一下触发器的说明;http://ke..com/view/1189954.htm
❺ 怎样添加触发器 来触发所对应的存储过程
对于sp为数据源的dw,可以在column specification 中右键可贺升丛以增加,删除列! 如果不知禅樱道column specification 在哪里可笑宽以单击view 菜单->column specifications
❻ 存储过程和触发器到底是个什么玩意
电脑上的主板上的触发器不是存储元件,确实姿春码是晶体管元件,比如说早期主板上常见的迹哪门电路,不森袜过现在都集成到南桥里了
❼ 请问SQL触发器用在什么地方 ...求解...
先说触发器,再说好处和坏处
-------------------------------
触发器,主要是用来同步更新数据的,杂乱枯燥的文章不给你转了,看起来累,举个例子吧:
假设有两个表,tab_1 , tab_2
再假设两个表里都有“人员性别”这个字段
tab_1的数据例如: 张三```男```1978`````2002
tab_2的数据例如: 张三```男```销售科```科长
我要改tab_1中张三的性别为“女”的话,那么tab_2的性别也该改为“女”,对吧,总不能两张表的性别不同吧。
如果不用触发器的话,我们就要改完tab_1,再去改tab_2,使性别都变成女
于是这里可以用到触发器了:
原理是:当tab_1中某人的性别发生变更后,数据库自动将tab_2的性别进行同步修改
触发器也可以这样应用:
1、当删除tab_1中的某人信息时,触发器一并删除该人的tab_2中的数据
2、在tab_1中新插入一个人员时,触发器在tab_2中一并新增一条该人的数据
===================================================================================
所以在你建立触发器时,就要指定该触发器的用途,是同步更新,还是删除、插入,由你指定。
基本的语法规则是:
create trigger 触发器名称(你自己命名的) on 表 for 用途(delete|update|insert)
as
delete|update|insert语句
----------------------------------------------------------------------
例如:
create trigger tri_A on tab_1 FOR DELETE
AS
delete tab_2 from deleted where tab_2.id = deleted.id;
意思是:在tab_1表上,建立触发器(tri_A),用于删除该表的数据时触发一个事务,什么事务呢?——删除tab_2中的该编号人员的记录。
FOR INSERT、FOR UPDATE分别是建立用于“插入记录”、“更新数据”的触发器,例子里的FOR DELETE是用于触发“删除记录”的。
这里还要看清楚,那个delete语句中的表,是from deleted哦,还有,where子句的tab_2.id = deleted.id,不是tab_2.id = tab_1.id哦,deleted.id是指你刚删除的那条记录的id(而update、insert,都用inserted.id)
===================================================================================
好处:相对于外部程序、存储过程,触发器可以更快更高效的维护数据
坏处:(我自己的经验)触发器要用的恰到好处,一个大型应用里,触发器越少越好,触发器会使编程时源码的结构被迫打乱,为将来的程序修改、源码阅读带来很大不便。
❽ 想学asp.net+mysql做一个网络投票系统 为何创建存储过程总是错误 希望大家能帮帮我
先找个mysql的存储过程的语法看下吧。
❾ ASP.NET投票系统,要求如下,网上找的都有些问题
/* 存储过程Pr_GetVotes */
CREATE PROCEDURE Pr_GetVotes
AS
SELECT * FROM Votes ORDER BY VoteID
/* 存念肆储过程Pr_GetSingleVote */
CREATE PROCEDURE Pr_GetSingleVote
(@VoteID int)
AS
SELECT Votes.* FROM Votes WHERE VoteID = @VoteID
/* 存储过程Pr_AddVote */
CREATE PROCEDURE Pr_AddVote(@Item varchar(100))
AS
INSERT INTO Votes(Item,ItemCount) VALUES(@Item,0) RETURN @@Identity
/* 存储过程Pr_UpdateVote */
CREATE PROCEDURE Pr_UpdateVote (@VoteID int)
AS
UPDATE Votes SET VoteCount = VoteCount + 1
WHERE VoteID = @VoteID
/* 存储过程Pr_DeleteVote */
CREATE PROCEDURE Pr_DeleteVote (@VoteID int)
AS
DELETE Votes
WHERE VoteID = @VoteID
public class Vote
{
public SqlDataReader GetVotes()
{
//定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//定义保存从数据库获取的结果的DataReader
SqlDataReader dr = null;
try
{ //执行存储过程
sqlHelper.RunProc("Pr_GetVotes", out dr);
}
catch (Exception ex)
{ //抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
//返回从数据库获取的结果
return (dr);
}
public int AddVote(String sItem)
{ //定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam("@Item", SqlDbType.VarChar,100,sItem)
};
try
{ //执行存储过程
return (sqlHelper.RunProc("Pr_AddVote", paramList));
}
catch (Exception ex)
{ //抛出执行数据库异常虚并
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
}
public void UpdateVote(int nVoteID)
{ //定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//创建访问数据仔誉轿库的参数
SqlParameter[] paramList = {sqlHelper.CreateInParam("@VoteID", SqlDbType.Int, 4,nVoteID)};
try
{ //执行存储过程
sqlHelper.RunProc("Pr_UpdateVote", paramList);
}
catch (Exception ex)
{ //抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
}
public void DeleteVote(int nVoteID)
{ //定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam("@VoteID", SqlDbType.Int, 4,nVoteID)
};
try
{ //执行存储过程
sqlHelper.RunProc("Pr_DeleteVote", paramList);
}
catch (Exception ex)
{ //抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
}
}
❿ 如何在触发器中调用存储过程
在触发器中调用存储过程:
CREATEtriggermalice
onBBSUser
forupdate
as
ifupdate(receive)--当receive字段发生update事件时触发
begin
updatebbsuser
setreceive_temp=bu.receive_temp+(i.receive-d.receive)
frombbsuserbu,deletedd,insertedi
wherebu.userid=i.userid
declare@tempfloat,@scopefloat
set@temp=(selectbb.receive_tempfrombbsuserbb,deleteddwherebb.userid=d.userid)
set@scope=(selectbb.receive_scopefromBBSUserbb,deleteddwherebb.userid=d.userid)
if@temp<=@scope
updateuserinfo
setstandnumber=bu.standnumber+(i.receive-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid
declare@userint,@comfloat
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
if@temp>@scope
begin
updateuserinfo
setstandnumber=bu.standnumber+(@scope-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid
updatebbsuser
setreceive_temp=@scope
frombbsuserbu,deletedd
wherebu.userid=d.userid
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
end
end