當前位置:首頁 » 存儲配置 » sql存儲過程異常處理

sql存儲過程異常處理

發布時間: 2022-08-29 03:50:24

A. pl/sql存儲過程,函數,游標和觸發器是什麼異常處理什麼意思

存儲過程:存儲過程是一組予編譯的SQL語句
它的優點:1.允許模塊化程序設計,就是說只需要創建一次過程,以後在程序中就可以調用該過程任意次。
2.允許更快執行,如果某操作需要執行大量SQL語句或重復執行,存儲過程比SQL語句執行的要快。
3.減少網路流量,例如一個需要數百行的SQL代碼的操作有一條執行語句完成,不需要在網路中發送數百行代碼。
4.更好的安全機制,對於沒有許可權執行存儲過程的用戶,也可授權他們執行存儲過程。

函數:函數是預先定義的功能塊(由代碼組成)。我們編寫函數的目的通常是為了反復調用它(提高代碼的復用性)。

游標:游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄 的結果集中每次提取一條記錄的機制。游標總是與一條T_SQL 選擇語句相關聯因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的游標。如果曾經用 C 語言寫過對文件進行處理的程序,那麼游標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對於游標而言,其道理是相同的。可見游標能夠實現按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。

觸發器:觸發器是一種特殊的存儲過程,它在試圖更改觸發器所保護的數據時自動執行。它被定義為在對表或視圖發出 UPDATE、INSERT 或 DELETE 語句時自動執行,在有數據修改時自動強制執行其業務規則。觸發器可以擴展 SQL Server 約束、默認值和規則的完整性檢查邏輯,但只要約束和默認值提供了全部所需的功能,就應使用約束和默認值。

異常處理:異常處理功能提供了處理程序運行時出現的任何意外或異常情況的方法。異常處理使用 try、catch 和 finally 關鍵字來嘗試可能未成功的操作,處理失敗,以及在事後清理資源。
異常可以由公共語言運行庫 (CLR)、第三方庫或使用 throw 關鍵字的應用程序代碼生成。

異常具有以下特點:
1.在應用程序遇到異常情況(如被零除情況或內存不足警告)時,就會產生異常。
2.發生異常時,控制流立即跳轉到關聯的異常處理程序(如果存在)。
3.如果給定異常沒有異常處理程序,則程序將停止執行,並顯示一條錯誤信息。
4.可能導致異常的操作通過 try 關鍵字來執行。
5.異常處理程序是在異常發生時執行的代碼塊。在 C# 中,catch 關鍵字用於定義異常處理程序。
6.程序可以使用 throw 關鍵字顯式地引發異常。
7.異常對象包含有關錯誤的詳細信息,其中包括調用堆棧的狀態以及有關錯誤的文本說明。
8.即使引發了異常,finally 塊中的代碼也會執行,從而使程序可以釋放資源。

異常處理理論上有兩種基本模型.
一種稱為"終止模型"(它是java與C++所支持的模型).在這種模型中,將假設錯誤非常關鍵,將以致於程序無法返回到異常發生的地方繼續執行.一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續執行.
另一種稱為"恢復模型".意思是異常處理程序的工作是修正錯誤,然後重新嘗試調動出問題的方法,並認為的二次能成功.
對於恢復模型,通常希望異常被處理之後能繼續執行程序.在這種情況下,拋出異常更像是對方法的調用--可以在Java里用這種方法進行配置,以得到類似恢復的行為.(也就是說,不是拋出異常,而是調用方法修正錯誤.)或者,把try塊放在while循環里,這樣就可以不斷的進入try塊,直到得到滿意的結果.雖然恢復模型開始顯得很吸引人,並且人們使用的操作系統也支持恢復模型的異常處理,但程序員們最終還是轉向了使用類似"終止模型"的代碼.因為:處理程序必須關注異常拋出的地點,這勢必要包含依賴於拋出位置的非通用性代碼.這增加了代碼編寫和維護的困難,對於異常可能會從許多地方拋出的大型程序來說,更是如此.

B. 存儲過程出現 SQL statement ignored錯誤是什麼問題

存儲過程出現 SQL statement ignored錯誤是:存儲過程語句錯誤,欄位或變數名可能拼錯,導致存儲過程無法執行。

解決方法:仔細檢查存儲過程里的變數,欄位,語句等是否正確。

(2)sql存儲過程異常處理擴展閱讀

PL/SQL引擎的作用:

編寫的SQL語句,通過網路、java程序或者客戶端工具發送給關系型資料庫管理系統,PL/SQL引擎負責拿到這個字元串(SQL語句就是一個字元串文本格式),對其SQL語句進行語法分析,判斷該SQL語句否符合Oracle中的語法要求,若符合,則執行SQL語句。

PL/SQL程序塊與SQL語言的功能:

SQL語句

通過多條SQL語句實現功能時,每條語句都需要在客戶端和服務端傳遞,而且每條語句的執行結果也需要在網路中進行交互,佔用了大量的網路帶寬,消耗了大量網路傳遞的時間,而在網路中傳輸的那些結果,往往都是中間結果,而不是我們所關心的。

PL/SQL程序塊

而使用PL/SQL程序是因為程序代碼存儲在資料庫中,程序的分析和執行完全在資料庫內部進行,用戶所需要做的就是在客戶端發出調用PL/SQL的執行命令,資料庫接收到執行命令後,在資料庫內部完成整個PL/SQL程序的執行,並將最終的執行結果反饋給用戶。

在整個過程中網路里只傳輸了很少的數據,減少了網路傳輸佔用的時間,所以整體程序的執行性能會有明顯的提高。

參考資料來源:網路-SqlServer

C. sql存儲過程中事務出現錯誤回滾,那麼在回滾之後的語句會執行嗎

會的。

一般回滾操作都是寫在異常處理,或是sql的最後。如果你的sql中出現錯誤 ,代碼會立即跳轉到錯誤處理代碼上執行,比如回滾,但緊接在錯誤行之後的代碼不會執行的。


1.update .....;

2.select ......;
3.when Exception
....rollback;
4.insert into .....

以上偽代碼,如果行1出錯,行2將不會執行,直接跳轉到行3,然後行4 也會執行。

D. db2的過程中怎樣寫異常處理

創建SQL存儲過程(CREATEPROCEDURE(SQL)statement)

CREATEPROCEDUREprocere-name(IN|OUT|INOUTparameter-namedata-type,...))---存儲過程可以設定輸入參數和輸出參數
LANGUAGESQL----DB2可以用多種語言編寫存儲過程,這里用的是純SQL
BEGIN---開始
DECLAREvIDsmallint;---定義變數和Oracle一樣DECLARE變數名變數的數據類型;
FORVASSELECTBRND_CDFROMTMP_BRND_CD---for循環tmp_brnd_cd預先創建好
DO---循環體開始
SETvID=BRND_CD;---對vID賦值,db2可以用set賦值,也可以用values賦值,這里可以寫成values(BRND_CD)intovID
INSERTINTOWWM_FORINSERT_TESTVALUES(vID);---往wwm_forinsert_test插入數據
ENDFOR;-----循環體結束
END@-----存儲過程結束

參數語法說明

1、procere-name:存儲過程的名字,在同一個資料庫的同一模式下,不能存在存儲過程名相同參數數目相同的存儲過程,即使參數的類型不同也不行。

2、(IN|OUT|INOUTparameter-namedata-type,...):傳入參數IN:輸入參數OUT:輸出參數INOUT:作為輸入輸出參數parameter-name:參數名字,在此存儲過程中唯一的標識符。data-type:參數類型,可以接收SQL類型和創建的表。不支持LONGVARCHAR,LONGVARGRAPHIC,DATALINK,REFERENCE和用戶自定義類型。

3、SPECIFICspecific-name:唯一的特定名稱(別名),可以用存儲過程名代替,這個特定名稱用於dorp存儲過程,或者給存儲過程添加註視用,但不能調用存儲過程。如果不指定,則資料庫會自動生成一個yymmddhhmmsshhn時間戳的名字。推薦給出別名。

4、DYNAMICRESULTSETSinteger:指定存儲過程返回結果的最大數量。存儲過程中雖然沒有return語句,但是卻能返回結果集。

5、CONTAINSSQL,READSSQLDATA,MODIFIESSQLDATA:指定存儲過程中的SQL訪問級別CONTAINSSQL:表示存儲過程可以執行中,既不可讀取SQL數據,也不可修改SQL數據。READSSQLDATA:表示存儲過程可以執行中,可讀取SQL,但不可修改SQL數據。MODIFIESSQLDATA:表示存儲過程可以執行任何SQL語句。可以對資料庫中的數據進行增加、刪除和修改。

6、:表示存儲過程是動態或者非動態的。動態的返回的值是不確定的。非動態的存儲過程每次執行返回的值是相同的。

7、CALLEDONNULLINPUT:表示可以調用存儲過程而不管任何的輸入參數是否為NULL,並且,任何的OUT或者INOUT參數可以返回一個NULL或者非空值。檢驗參數是否為NULL是在過程中進行的。

8、INHERITSPECIALREGISTERS:表示繼承專用寄存器。

9、:建立存儲點。OLDSAVEPOINTLEVEL是默認的存儲點。

10、LANGUAGESQL:指定程序的主體用的是SQL語言。

11、:表示存儲過程是否執行一些改變理資料庫狀態的活動,而不通過資料庫管理器管。默認是EXTERNALACTION。如果指定為NOEXTERNALACTION,則資料庫會確定最最佳優化方案。

12、PARAMETERCCSID:指定所有輸出字元串數據的編碼,默認為UNICODE編碼資料庫為PARAMETERCCSIDUNICODE,其他的資料庫默認為PARAMETERCCSID3ASCII。

13、SQL-procere-body:存儲過程的主體

E. 如何在sqlserver 的函數或存儲過程中拋出異常

其語法如下:

RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]

簡要說明一下:

第一個參數:{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一個sys.messages表中定義的消息代號;
使用 sp_addmessage 存儲在 sys.messages 目錄視圖中的用戶定義錯誤消息號。
用戶定義錯誤消息的錯誤號應當大於 50000。

msg_str:表示也可以是一個用戶定義消息,該錯誤消息最長可以有 2047 個字元;
(如果是常量,請使用N'xxxx',因為是nvarchar的)
當指定 msg_str 時,RAISERROR 將引發一個錯誤號為 5000 的錯誤消息。

@local_variable:表示也可以是按照 msg_str 方式的格式化字元串變數。

第二個參數:severity
用戶定義的與該消息關聯的嚴重級別。(這個很重要)
任何用戶都可以指定 0 到 18 之間的嚴重級別。
[0,10]的閉區間內,不會跳到catch;
如果是[11,19],則跳到catch;
如果[20,無窮),則直接終止資料庫連接;

第三個參數:state
如果在多個位置引發相同的用戶定義錯誤,
則針對每個位置使用唯一的狀態號有助於找到引發錯誤的代碼段。

介於 1 至 127 之間的任意整數。(state 默認值為1)
當state 值為 0 或大於 127 時會生成錯誤!

第四個參數:argument
用於代替 msg_str 或對應於 msg_id 的消息中的定義的變數的參數。

第五個參數:option
錯誤的自定義選項,可以是下表中的任一值:
LOG :在錯誤日誌和應用程序日誌中記錄錯誤;
NOWAIT:將消息立即發送給客戶端;
SETERROR:將 @@ERROR 值和 ERROR_NUMBER 值設置為 msg_id 或 50000;

[SQL]代碼示例

--示例1DECLARE @raiseErrorCode nvarchar(50)
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)

--示例2RAISERROR (
N'This is message %s %d.', -- Message text,
10, -- Severity,
1, -- State,
N'number', -- First argument.
5 -- Second argument.
);
-- The message text returned is: This is message number 5.
GO

--示例3RAISERROR (N'<<%*.*s>>', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO

--示例4RAISERROR (N'<<%7.3s>>', -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

--示例5
--A. 從 CATCH 塊返回錯誤消息
以下代碼示例顯示如何在 TRY 塊中使用 RAISERROR 使執行跳至關聯的 CATCH 塊中。
它還顯示如何使用 RAISERROR 返回有關調用 CATCH 塊的錯誤的信息。

BEGIN TRY
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();

RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;

--示例6
--B. 在 sys.messages 中創建即席消息
以下示例顯示如何引發 sys.messages 目錄視圖中存儲的消息。
該消息通過 sp_addmessage 系統存儲過程,以消息號50005添加到 sys.messages 目錄視圖中。

sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO

RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

sp_dropmessage @msgnum = 50005;
GO

--示例7
--C. 使用局部變數提供消息文本
以下代碼示例顯示如何使用局部變數為 RAISERROR 語句提供消息文本。sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO

RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

sp_dropmessage @msgnum = 50005;
GO
轉自博客園: www.cnblogs.com/weixing/p/3930162.html

F. sql存儲過程動態Insert參數異常

檢查一下表 T_Score_1002的結構,很可能SubSemester列是varchar 類型的。必須保證觸發器和存儲過程中的@SubSemester變數的類型與表中SubSemester列的類型一致或者兼容。

G. 掃健康碼SQL運行異常怎麼辦

解釋如下。
在程序中,有時候完成一些Transact-SQL會出現錯誤、異常信息。如果我們想自己處理這些異常信息的話,需要手動捕捉這些信息。那麼我們可以利用trycatch完成。
TRY?CATCH構造包括兩部分:一個TRY塊和一個CATCH塊。如果在TRY塊中所包含Transact-SQL語句中檢測到錯誤條件,控制將被傳遞到CATCH塊(可在此塊中處理該錯誤)。
CATCH塊處理該異常錯誤後,控制將被傳遞到ENDCATCH語句後面的第一個Transact-SQL語句。如果ENDCATCH語句是存儲過程或觸發器中的最後一條語句,控制將返回到調用該存儲過程或觸發器的代碼。將不執行TRY塊中生成錯誤的語句後面的Transact-SQL語句。
如果TRY塊中沒有錯誤,控制將傳遞到關聯的ENDCATCH語句後緊跟的語句。如果ENDCATCH語句是存儲過程或觸發器中的最後一條語句,控制將傳遞到調用該存儲過程或觸發器的語句。
TRY塊以BEGINTRY語句開頭,以ENDTRY語句結尾。在BEGINTRY和ENDTRY語句之間可以指定一個或多個Transact-SQL語句。CATCH塊必須緊跟TRY塊。CATCH塊以BEGINCATCH語句開頭,以ENDCATCH語句結尾。在Transact-SQL中,每個TRY塊僅與一個CATCH塊相關聯。

H. 如何在SQL存儲過程中處理錯誤

1. 建立一個過程,第一個語句 DECLARE EXIT HANDLER是用來處理異常的,意思是如果錯誤 1216發生,這個程序將會在錯誤記錄表中插入一行,
EXIT的意思是 當動作成功提交後推出這個復合語句。
create procere p22(parameter int)
begin
declare exit Handler for 1452
insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));
insert into t3 values(parameter);
end;//
2. 申明異常處理的語法 DECLARE HANDLER syntax:
DECLARE {EXIT|CONTINUE} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement
上面就是錯誤處理的用法,也就是一段當程序出錯後自動觸發的代碼,MYSQL允許兩種處理器,一種是exit處理,另外一種是 continue處理,與exit
不同的是在於他執行後,原主程序仍然繼續運行,那麼該復合語句就沒有出口了。
----continue處理的例子:
create table t4(s1 int primary key);//
create procere p23()
begin
declare continue handler for SQLSTATE '23000' set @x2=1;
set @x=1;
insert into t4 values (1);
set @x=2;
insert into t4 values(1);
set @x=3;
select @x, @x2;
end;//
call p23();//
---- rollback(回滾事務),定義自己的錯誤處理名字 declare '錯誤處理名' condition for SQLSTATE'23000';
create procere p24()
begin
declare ViolationSelf condition for SQLSTATE'23000';
DECLARE EXIT HANDLER for ViolationSelf rollback;
start transaction;
insert into t2 values(1);
insert into t2 values(1);
commit;
end;//

/******************************************** Cursor游標 **********************************************************/
游標實現功能的摘要: 聲明游標, 打開游標,從游標里讀取,關閉游標
DECLARE cursor-name CURSOR FOR SELECT ······
OPEN cursor-name;
FETCH cursor-name INTO variable;
CLOSE cursor-name;
1. create procere p25(out return_val int)
begin
DECLARE a,b,c int;
DECLARE cur_1 CURSOR for select s1 from t;
DECLARE continue handler for not found set b=1;
open cur_1;
set c=0;
repeat
fetch cur_1 into a;
until b=1
end repeat;
close cur_1;
set return_val=a;
end;//
2. create procere p25_1(out return_val int)
begin
DECLARE a,b,c int;
DECLARE cur_1 CURSOR for select s1 from t;
DECLARE continue handler for not found set b=1;
open cur_1;
set c=0;
lable_1:loop
fetch cur_1 into a;
if b=1 then
leave lable_1;
end if;
set c=c+1;
end loop;
close cur_1;
set return_val=c;
end;//
create procere p34(in va int)
begin
delete from t where s1=va;
end;//

I. mysql存儲過程怎麼獲取異常信息

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
其中,
handler_type的取值范圍:CONTINUE | EXIT | UNDO
condition_value的取值范圍:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。 對一個CONTINUE處理程序,當前子程序的執行在執行處理程序語句之後繼續。對於EXIT處理程序,當前BEGIN...END復合語句的執行被終止。UNDO 處理程序類型語句還不被支持。

· SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。

· NOT FOUND是對所有以02開頭的SQLSTATE代碼的速記。

· SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。

註:除了SQLSTATE值,MySQL錯誤代碼也不被支持。

例:
delimiter $$

CREATE TABLE `_t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val1` varchar(20) DEFAULT NULL,
`val2` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=113 DEFAULT CHARSET=latin1$$

DELIMITER $$

CREATE DEFINER=`abandonship`@`%` PROCEDURE `P_TestException`()
BEGIN
declare _var,_err int default 0;

J. 如何在 SQL Server 的存儲過程和函數里進行錯誤處理

在存儲過程中使用事務時非常重要的,使用數據可以保持數據的關聯完整性,在Sql server存儲過程中使用事務也很簡單,用一個例子來說明它的語法格式:

Create Procere MyProcere ( @Param1 nvarchar(10), @param2 nvarchar(10) ) AS BeginSet NOCOUNT ON; Set XACT_ABORT ON; Begin Tran Delete from table1 where name=』abc』; Insert into table2 values(value1,value2,value3); Commit Tran End

熱點內容
安卓上哪裡下大型游戲 發布:2024-12-23 15:10:58 瀏覽:189
明日之後目前適用於什麼配置 發布:2024-12-23 14:56:09 瀏覽:55
php全形半形 發布:2024-12-23 14:55:17 瀏覽:829
手機上傳助手 發布:2024-12-23 14:55:14 瀏覽:733
什麼樣的主機配置吃雞開全效 發布:2024-12-23 14:55:13 瀏覽:830
安卓我的世界114版本有什麼 發布:2024-12-23 14:42:17 瀏覽:711
vbox源碼 發布:2024-12-23 14:41:32 瀏覽:278
詩經是怎麼存儲 發布:2024-12-23 14:41:29 瀏覽:660
屏蔽視頻廣告腳本 發布:2024-12-23 14:41:24 瀏覽:420
php解析pdf 發布:2024-12-23 14:40:01 瀏覽:819