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下即可