sql存储过程事务
❶ sql存储过程中事务出现错误回滚,那么在回滚之后的语句会执行吗
会的。
一般回滚操作都是写在异常处理,或是sql的最后。如果你的sql中出现错误 ,代码会立即跳转到错误处理代码上执行,比如回滚,但紧接在错误行之后的代码不会执行的。
如
1.update .....;
2.select ......;
3.when Exception
....rollback;
4.insert into .....
以上伪代码,如果行1出错,行2将不会执行,直接跳转到行3,然后行4 也会执行。
❷ SQL的存储过程和事务是怎么回事
存储过程就相当于编程语言中的函数或方法,根据用户给定的参数执行一段代码
例:你给我20分,我从键盘输入文字,回答问题,并提交答案.我所做的就是一个存储过程,你给的20分是参数,你给的分多,我就回答的详细
事务是一种机制,确保一组数据库命令,要么全都执行,要么都不执行
例:你到银行转帐1000元到我的账户里,当钱刚从你的账户里取出来(还没来的及转入我的账户),突然断电了,这时你的账户就莫名其妙的损失了1000元,事务就是为了避免这种情况,只有当你的账户减少1000,并且我的账户存入1000之后,这个转帐才算成功,所以就要将"存款"和"取款"写到一个事务中去
❸ sql中的存储过程里怎么写事务回滚啊
CREATE PROC [dbo].[notice_Delete] --- 同时删除该通知书和对应的节点
@tbl VARCHAR(30),
@pid INT
AS
BEGIN
DECLARE @tblname VARCHAR(30) ;
DECLARE @sql VARCHAR(1000) ;
SET @tblname = @tbl
SET @sql = 'delete ' + @tblname + ' where id ='
+ CONVERT(VARCHAR(10), @pid)
BEGIN TRAN --开始事务
EXEC ( @sql
)
IF ( @@rowcount = 0 ) --执行结果影响行数为0
BEGIN
ROLLBACK TRAN --回滚
END
ELSE
BEGIN
DELETE FROM tbl_treenotice
WHERE purposeid = @pid
IF ( @@rowcount = 0 ) --执行结果影响行数为0
BEGIN
ROLLBACK TRAN --回滚
END
ELSE
BEGIN
COMMIT TRAN --提交事务
END
END
END
❹ 在SQL中存储过程的一般语法是什么
1、 创建语法
createproc|procerepro_name
[{@参数数据类型}[=默认值][output],
{@参数数据类型}[=默认值][output],
....
]
as
SQL_statements
2、 创建不带参数存储过程
--创建存储过程
if(exists(select*fromsys.objectswherename='proc_get_student'))
dropprocproc_get_student
go
createprocproc_get_student
as
select*fromstudent;
--调用、执行存储过程
execproc_get_student;
3、 修改存储过程
--修改存储过程
alterprocproc_get_student
as
select*fromstudent;
4、 带参存储过程
--带参存储过程
if(object_id('proc_find_stu','P')isnotnull)
dropprocproc_find_stu
go
createprocproc_find_stu(@startIdint,@endIdint)
as
select*fromstudentwhereidbetween@startIdand@endId
go
execproc_find_stu2,4;
5、 带通配符参数存储过程
--带通配符参数存储过程
if(object_id('proc_findStudentByName','P')isnotnull)
dropprocproc_findStudentByName
go
createprocproc_findStudentByName(@namevarchar(20)='%j%',@nextNamevarchar(20)='%')
as
select*fromstudentwherenamelike@nameandnamelike@nextName;
go
execproc_findStudentByName;execproc_findStudentByName'%o%','t%';
(4)sql存储过程事务扩展阅读:
SQL存储过程优点:
1、重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
❺ SQL中存储过程是干什么用的
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
(5)sql存储过程事务扩展阅读:
SQL中存储过程优点:
1、重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
4、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
❻ SQL的存储过程中的事物处理是begin tran 还是begin transaction
俩个都行,tran是transaction的简写形式,就想存储过程:proc是process的简写一样的.
❼ sql怎样新建存储过程
一:创建没有参数的存储过程:
CREATE PROCEDURE select_all
AS
BEGIN
SELECT * from T_login1
GO
二:创建带参数的存储过程:
CREATE PROCEDURE select_name
@id uniqueidentifier
AS
BEGIN
SELECT * from T_login1 where PSN0001A=@id
GO
(7)sql存储过程事务扩展阅读:
创建存储过程的注意事项:
1、保持事务简短,事务越短,越不可能造成阻塞。
2、在事务中尽量避免使用循环while和游标,以及避免采用访问大量行的语句。
3、在启动事务前完成所有的计算和查询等操作,避免同一事务中交错读取和更新。可以使用表变量预先存储数据。即存储过程中查询与更新使用两个事务实现。
4、超时会让事务不执行回滚,超时后如果客户端关闭连接sqlserver自动回滚事务。如果不关闭,将造成数据丢失,而其他事务将在这个未关闭的连接上执行,造成资源锁定,甚至服务器停止响应。
❽ Java调用SQL存储过程、事务
例示一个不带参数的简单存储过程。多数存储过程的功能比本例复杂多了,但这里主要说明存储过程的一些基本要点。如前面所述,不同DBMS定义存储过程的语法是不同的。例如,有些DBMS使用begin
.
.
.
end或其他关键字指明存储过程定义的开始和结束。在有些DBMS中,下面的SQL语句可创建一个存储过程:
create
procere
SHOW_SUPPLIERS
as
select
SUPPLIERS.SUP_NAME,
COFFEES.COF_NAME
from
SUPPLIERS,
COFFEES
where
SUPPLIERS.SUP_ID
=
COFFEES.SUP_ID
order
by
SUP_NAME
下面的代码将SQL语句放到一个字符串中,然后赋给变量createProcere以备后用:
String
createProcere
=
"create
procere
SHOW_SUPPLIERS
"
+
"as
"
+
"select
SUPPLIERS.SUP_NAME,
COFFEES.COF_NAME
"
+
"from
SUPPLIERS,
COFFEES
"
+
"where
SUPPLIERS.SUP_ID
=
COFFEES.SUP_ID
"
+
"order
by
SUP_NAME";
下面的代码段使用Connection对象con来创建Statement对象,用于把创建存储过程的SQL语句发送给数据库:
Statement
stmt
=
con.createStatement();
stmt.executeUpdate(createProcere);
存储过程SHOW_SUPPLIERS将作为一个可调用的数据库对象在数据库中编译并存储,调用时就像调用其他方法一样。
❾ SQL 存储过程和事务问题
自定义的存储过程: 常用格式 Create procere procee_name [@parameter data_type][output] [with]{recompile|encryption} as sql_statement解释: output:表示此参数是可传回的with {recompile|encryption}recompile:表示每次执行此存储过程时都重新编译一次encryption:所创建的存储过程的内容会被加密如: 表book的内容如下 编号 书名 价格 001 C语言入门 $30 002 PowerBuilder报表开发 $52 实例1:查询表Book的内容的存储过程 create proc query_book as select * from book go exec query_book 实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额 Create proc insert_book @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output with encryption ---------加密 as insert book(编号,书名,价格) Values(@param1,@param2,@param3) select @param4=sum(价格) from book go 执行例子: declare @total_price money exec insert_book '003','Delphi 控件开发指南',$100,@total_price print '总金额为'+convert(varchar,@total_price) go存储过程的3种传回值: 1.以Return传回整数 2.以output格式传回参数 3.Recordset传回值的区别: output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中 实例3:设有两个表为Proct,Order,其表内容如下: Proct 产品编号 产品名称 客户订数 001 钢笔 30 002 毛笔 50 003 铅笔 100 Order 产品编号 客户名 客户订金 001 南山区 $30 002 罗湖区 $50 003 宝安区 $4请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,总金额=订金*订数,临时表放在存储过程中代码如下: Create proc temp_sale as select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额 into #temptable from Proct a inner join Order b on a.产品编号=b.产品编号 if @@error=0 print 'Good' else print 'Fail' go来源: http://www.knowsky.com
❿ 在pl/sql中创建的存储过程中的事务是什么
如果p1是调用p2后,再进行dml操作
先执行p2的
既然p2中向外抛出错误
你可以在p1中
捕获到异常rollback下即可