存儲過程錯誤信息
⑴ 怎樣判斷存儲過程出錯並捕捉錯誤信息
--通過sqlcode , sqlerrm 這兩個內置變數來查看,例如:
DECLARE
--聲明異常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition
v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text
BEGIN
--...
--拋出異常
IF ( ... ) THEN --(括弧內填拋出異常的條件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉異常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他異常,並獲得 捕獲異常的內容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.
dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/
/**
sqlcode 就是錯誤代碼
sqlerrm 就是sql錯誤信息。注意用substr來截取,否則輸出很難看。
**/
⑵ db2存儲過程怎麼保存運行錯誤詳細信息
如果是在plsql developer中修改的,可以直接點那個齒輪圖標,或者F8即可編譯。 如果是在sqlplus中,那就敲入修改後的過程代碼(create or replace procere...),最後以/結尾運行即可。
⑶ plsql調用存儲過程報錯,怎麼調試
1. 打開PL/SQL Developer如果 在機器上安裝了PL/SQL Developer的話,打開PL/SQL Developer界面輸入 用戶名,密碼和host名字,這個跟在程序中web.config中配置的完全相同,點擊確定 找到 需要調試的存儲過程所在的包(Package bodies),如PACK_ACTIVITY,點擊右鍵,在彈出菜單中選擇[查看],得到包中的所有存儲過程和他們的代碼.
2. 添加debug信息為了 能夠單步跟蹤存儲過程,需要為其所在的包添加debug信息,右鍵點擊需要調試的包,在彈出菜單中選中[添加調試信息](這個很重要).這樣 就為包體添加了調試信息。
3. 調 試存儲過程現在 所有的准備工作都做好了,可以調試跟蹤存儲過程了。選擇 需要調試的存儲過程,點擊右鍵,在彈出菜單中 選擇[測試],進去測試窗口.測試窗口中有為了測試該存儲過程自動所產生的代碼,當然你也可以自己另外加入和修改代碼,對於我們目前只是為了調試存儲過程, 自動生成的代碼已經足夠了。接著按照如下的步驟進行調試。
(1)添加存儲過程所需要的參數,我們項目中的大多數存儲過程都是需要參數 的,參數可以在測試窗口右下部分輸入。如:GetPanNO_New需要一個輸入參數v_employeeid,我們輸入180,輸出參數是mycursor,是查看結果的,不需要輸入任何值。
(2)開始調試,點擊[調試]菜單->[開始](或者按F9),就進去調試模式了,程序開始停在begin這一行.
(3)以後的調試過程跟我們熟悉的的調試過程就一樣了:運行(Ctrl+R)單步 進入(Ctrl+N)單步 跳過(Ctrl+O)單步 退出(Ctrl+T)或者 點擊debug工具條上的按扭:當按Ctrl+N進去存儲過程的源代碼中後 在這 個窗口中可以查看過程中的變數值和堆棧。
(4)調試運行完了後,可以查看結果如下(點擊mycursor變數旁邊的按鈕).
4. Tip 令人 比較郁悶的是我們項目中很多的存儲過程都是一個SELECT語句,不管這個SELECT語句多麼復雜(SELECT語句中有嵌套的子SELECT語句),它也只能作為一行代碼,單步跟蹤就沒有什麼意義了。
⑷ 存儲過程 的錯誤信息!
INSERT 語句, 沒有 WHERE 的條件的啊
除非你是
INSERT INTO 表 SELECT * FROM 另外一個表 WHERE 條件。
INSERT INTO 表 VALUES(...)就是直接插入的。
你那裡的邏輯,是要插入?還是更新呢?
是要插入的話,直接把WHERE後面的SQL刪除了就好。
⑸ mysql 存儲過程提示錯誤!!求高人解答
用過begin——end句塊的應該都接觸過declare。
declare是用來定義變數和常用處理、聲明之類的關鍵字。在mysql存儲過程出現之前declare是一塊雞肋,大家常用declare來定義局部變數,我習慣性的還是使用set來定義變數(雖然是全局的,但是來的方便)。
存儲過程出現後declare的標准處理定義就變成了非常強大的工具,可以用來為存儲過程添加一些非常強大的錯誤處理機制。
首先需要提一點的是declare定義變數如果想定義varchar型的,必須註明參數最大長度,即declare varchar(20).
在這里我們不深究它用來定義參數的小細節
我們主要來研究DECLARE Condition 和 DECLARE Handler
DECLARE Condition 和 DECLARE Handler可以說是為了處理錯誤而生的。
功能上講DECLARE Condition出現的時間比較早,功能也比較簡單,它可以通過錯誤編號或者SQLSTATE來觸發一各名字,說明白一點就是當某個錯誤編號出現的時候替換一個名字給它。這樣調用的時候,我們不用去記一大串錯誤編號了。
它的標准語法我們可以在mysql的附註中找到。
DECLARE condition_name CONDITION FOR condition_value
condition_value:
例子如下:
DECLARE errname CONDITION FOR SQLSTATE '23000'
將返回SQLSTATE信息為23000的錯誤定名為errname
這個名字就可以被我們的絕對重頭戲DECLARE Handler調用了,在DECLARE Handler中可以定義錯誤的處理辦法,可以使用begin和end來標記語句塊,可以單獨使用rollback。處理的過程也可以定義為繼續執行和中斷存儲過程。
標准語法:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type: 處理的過程。
CONTINUE 繼續執行未完成的存儲過程,直至結束。(常用,默認)
| EXIT 出現錯誤即自動跳出所在的begin不再執行後面的語句。
| UNDO 氣死我了,不支持為什麼寫在這里,害我測試了好久都是語法錯誤。
condition_value: 處理的觸發條件
SQLSTATE [VALUE] sqlstate_value 不用說了,最常用的錯誤定義,自己去查錯誤列表吧。
| condition_name 我們剛剛定義的那個名字errnmae就是用在這里的。
| SQLWARNING 這個太好用了,從錯誤編號01開始的錯誤。相當於錯誤的通配符。
| NOT FOUND 和上面差不多,從02開始。
| SQLEXCEPTION 上面兩個中沒有包括的錯誤它都可以用來觸發,就是說你想定義只要出錯就觸發的話就定義出錯條件為SQLWARNING+SQLEXCEPTION。
| mysql_error_code 錯誤編號,和第一個不一樣,不過同樣可以在錯誤列表從中查到,是我比較常用的。
例子
DECLARE errname CONDITION FOR SQLSTATE '23000'; 給導致錯誤23000的錯誤定義名字為errname
DECLARE continue handler for errname 當errname發生時作下面的處理
BEGIN 語句開始
set @x=1; 設置@x=1
select @x; 輸出x
END; 結束出錯處理。
⑹ 電腦交易軟體提示「執行存儲過程錯誤」如何處理
您好,該報錯原因是取消委託時系統繁忙,建議您5分鍾後再進行嘗試操作。
⑺ 如何在SQL存儲過程中處理錯誤
一、存儲過程中使用事務的簡單語法
在存儲過程中使用事務時非常重要的,使用數據可以保持數據的關聯完整性,在Sql server存儲過程中使用事務也很簡單,用一個例子來說明它的語法格式:
CreateProcereMyProcere
(@Param1nvarchar(10),
@param2nvarchar(10)
)
AS
Begin
SetNOCOUNTON;
SetXACT_ABORTON;
BeginTran
Deletefromtable1wherename=』abc』;
Insertintotable2values(value1,value2,value3);
CommitTran
End
說明:
1 、使用存儲過程執行事物,需要開啟XACT_ABORT參數(默認值為Off),將該參數設置為On,表示當執行事務時,如果出錯,會將transcation設置為uncommittable狀態,那麼在語句塊批處理結束後將回滾所有操作;如果該參數設置為Off,表示當執行事務時,如果出錯,出錯的語句將不會執行,其他正確的操作繼續執行。
2、當SET NOCOUNT 為 ON 時,不返回計數(計數表示受 Transact-SQL 語句影響的行數,例如在Sql server查詢分析器中執行一個delete操作後,下方窗口會提示(3)Rows Affected)。當 SET NOCOUNT 為 OFF 時,返回計數,我們應該在存儲過程的頭部加上SET NOCOUNT ON 這樣的話,在退出存儲過程的時候加上 SET NOCOUNT OFF這樣的話,以達到優化存儲過程的目的。
二、事務內設置保存點
用戶可以在事務內設置保存點或標記。保存點定義如果有條件地取消事務的一部分,事務可以返回的位置。如果將事務回滾到保存點,則必須(如果需要,使用更多的 Transact-SQL 語句和 COMMIT TRANSACTION 語句)繼續完成事務,或者必須(通過將事務回滾到其起始點)完全取消事務。若要取消整個事務,請使用 ROLLBACK TRANSACTION transaction_name 格式。這將撤消事務的所有語句和過程。如:
代碼
CreateProcereMyProcere
AS
Begin
SetNOCOUNTON;
SetXACT_ABORTON;
begintranok--開始一個事務OK
deletefromrxqzwhereqz='rx015'--刪除數據
savetranbcd--保存一個事務點命名為bcd
updateszsetname='李麗s'wherename='李麗'--修改數據
if@@error<>0--判斷修改數據有沒有出錯
begin--如果出錯
rollbacktranbcd--回滾事務到BCD的還原點
committranok--提交事務
end
else--沒有出錯
committranok--提交事務
End
說明:1、@@error判斷是否有錯誤,為0表示沒有錯誤,但是對那種重大錯誤無法捕捉,而且@@error只能前一句sql語句生效。
三、存儲過程使用try…catch捕獲錯誤
在存儲過程中可以使用try…catch語句來捕獲錯誤,如下:
CreateProcereMyProcere
(@Param1nvarchar(10),
@param2nvarchar(10)
)
AS
Begin
SetNOCOUNTON;
Begintry
Deletefromtable1wherename=』abc』;
Insertintotable2values(value1,value2,value3);
Endtry
BeginCatch
SELECTERROR_NUMBER()ASErrorNumber,
ERROR_MESSAGE()ASErrorMessage;
EndCatch
End
說明:1、捕獲錯誤的函數有很多,如下:
ERROR_NUMBER() 返回錯誤號。
ERROR_SEVERITY() 返回嚴重性。
ERROR_STATE() 返回錯誤狀態號。
ERROR_PROCEDURE() 返回出現錯誤的存儲過程或觸發器的名稱。
ERROR_LINE() 返回導致錯誤的常式中的行號。
ERROR_MESSAGE() 返回錯誤消息的完整文本。該文本可包括任何可替換參數所提供的值,如長度、對象名或時間。
2、有些錯誤,如sql語句中的表名稱輸入錯誤,這是資料庫引擎無法解析這個表名稱時,所發生的錯誤在當前的try…catch語句中無法捕獲,必須由外層調用該存儲過程的地方使用 try…catch來進行捕獲。
四、存儲過程中事務和try…catch聯合使用
在存儲過程中使用事務時,如果沒有try…catch語句,那麼當set xact_abort on時,如果有錯誤發生,在批處理語句結束後,系統會自動回滾所有的sql操作。當set xact_abort off時,如果有錯誤發生,在批處理語句結束後,系統會執行所有沒有發生錯誤的語句,發生錯誤的語句將不會被執行。
在存儲過程中使用事務時,如果存在try…catch語句塊,那麼當捕獲到錯誤時,需要在catch語句塊中手動進行Rollback操作,否則系統會給客戶端傳遞一條錯誤信息。如果在存儲過程開始處將set xact_abort on,那麼當有錯誤發生時,系統會將當前事務置為不可提交狀態,即會將xact_state()置為-1,此時只可以對事務進行Rollback操作,不可進行提交(commit)操作,那麼我們在catch語句塊中就可以根據xact_state()的值來判斷是否有事務處於不可提交狀態,如果有則可以進行rollback操作了。如果在存儲過程開始處將set xact_abort off,那麼當有錯誤發生時,系統不會講xact_state()置為-1,那麼我們在catch塊中就不可以根據該函數值來判斷是否需要進行rollback了,但是我們可以根據@@Trancount全局變數來判斷,如果在catch塊中判斷出@@Trancount數值大於0,代表還有未提交的事務,既然進入catch語句塊了,那麼還存在未提交的事務,該事務應該是需要rollback的,但是這種方法在某些情況下可能判斷的不準確。推薦的方法還是將set xact_abort on,然後在catch中判斷xact_state()的值來判斷是否需要Rollback操作。
下面我們來看看兩個例子:
一.使用Set xact_abort on
CreateprocmyProcere
As
begin
setxact_aborton;
begintry
begintran
insertintoTestStuvalues('Terry','boy',23);
insertintoTestStuvalues('Mary','girl',21);
committran
endtry
begincatch
--在此可以使用xact_state()來判斷是否有不可提交的事務,不可提交的事務
--表示在事務內部發生錯誤了。Xact_state()有三種值:-1.事務不可提交;
--1.事務可提交;0.表示沒有事務,此時commit或者rollback會報錯。
ifxact_state()=-1
rollbacktran;
endcatch
end
二.使用Set xact_abort off
CreateprocmyProcere
As
begin
setxact_abortoff;
begintry
begintran
insertintoTestStuvalues('Terry','boy',23);
insertintoTestStuvalues('Mary','girl',21);
committran
endtry
begincatch
--在此不可以使用xact_state來判斷是否有不可提交的事務
--只可以使用@@Trancount來判斷是否有還未提交的事務,未提交的事務未必
--就是不可提交的事務,所以使用@@TranCount>0後就RollBack是不準確的
if@@TranCount>0
rollbacktran;
endcatch
end
另外,對於@@Trancount需要說明的是,begin tran 語句將 @@Trancount加 1。Rollback tran將 @@Trancount遞減到 0,但 Rollback tran savepoint_name 除外,它不影響 @@Trancount。Commit tran 或 Commit work 將 @@Trancount 遞減 1。
⑻ oracle存儲過程,如何獲得詳細的錯誤信息
create or replace procere proc_test( strAge in string, strName in string, ret_code out string, v_error_message out string) is
begin
declare
strsql varcchar(1024);
v_error_desc varcchar(1024);
begin
v_error_desc :='student';
strsql :='select name from student where age=100';
execute immediate strsql using strAge ;
v_error_desc :='teacher';
strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ;
ret_code:=0;
v_error_desc :='OK';
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_desc := '錯誤位置:' || v_error_desc;
v_error_message := sqlerrm;
rollback;
end;
end proc_cancel_digital_id;
⑼ oracle存儲過程提示編譯完成但存在錯誤,如何查看錯誤
1、首先打開PL/SQL Developer軟體,新建sql窗口。
⑽ mysql 創建存儲過程時錯誤
如果t_kecheng只有2個欄位的話,並且數據類型和存儲過程輸入參數一致的話,存儲過程沒問題。
mysql的1064錯誤就是語法不正確,最好給出t_kecheng的表結構,還有,你這個錯誤是在創建的時候報的還是怎麼?
自己簡單創建了個表,是沒問題的,另外你注意一下:參數名最好不要跟欄位名起一樣的,有時會出現很多不必要的麻煩,比如如果你t_kecheng表裡的欄位名也叫pno和pname,那麼你參數最好用v_pno或v_pname,這樣區分一下。
createtablet_kecheng
(pnoint,
pnamevarchar(20))
CREATEPROCEDUREpro
(INpnoINT,
INpnameVARCHAR(20))
BEGIN
INSERTINTOt_kechengVALUES(pno,pname);
END;
隨便輸入點信息也是可以的。