當前位置:首頁 » 存儲配置 » 存儲過程錯誤

存儲過程錯誤

發布時間: 2023-06-03 20:39:41

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

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

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

(1)存儲過程錯誤擴展閱讀

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

B. Warning: Procere created with compilation errors 創建存儲過程的時候出現的錯誤

Warning: Procere created with compilation errors創建存儲過程出現錯誤,是設置錯誤造成的,解決方法如下:

1、打開mysql的客戶端管理軟體,找到想要創建存儲過程的資料庫,在【Stored Proceres】菜單上點擊滑鼠右鍵,選擇【Create Stored Procere】菜單項。

C. 如何在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。

D. 存儲過程執行出錯,該怎麼解決

第一:如果是存儲過程中拋了異常,那麼結合事務,出現異常的時候,就回滾事務;
第2:如果邏輯不符合需求,這個就只有從新梳理了,這個是沒有辦法的,

E. 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;

隨便輸入點信息也是可以的。

F. 創建存儲過程報錯如下: 警告: 創建的過程帶有編譯錯誤。

1. 創建完存儲過程(在命令行),可以用showerr看具體錯誤
2. 可以在PLSQL中,輸入"全班排名", 然後俺右鍵->編輯,看到具體錯誤
3. 你的sql從from後一直到group by的分號;是多餘的,即便單獨在SQL窗口也會報錯
SQL應該改成
select b.學號,a.姓名, avg(a.成績) 平均分,sum(a.成績) 總分

from 成績信息表 a
join 學籍信息表 b on (a.學號=b.學號)
join 班級信息表 c on (c.班級號=b.班級號)
where c.班級名稱=class
group by b.學號
order by avg(成績) ,b.學號 desc;
4. 存儲過程不能直接用SQL,要用游標或select……into方式
比如:
create or replace procere 全班排名(
class in char(8)
)
as
cursor cur(p_class char(8)) is
select b.學號,a.姓名, avg(a.成績) 平均分,sum(a.成績) 總分

from 成績信息表 a
join 學籍信息表 b on (a.學號=b.學號)
join 班級信息表 c on (c.班級號=b.班級號)
where c.班級名稱=class
group by b.學號
order by avg(成績) ,b.學號 desc;
rs cur%rowtype;
begin
for rs in cur(class) loop
dbms_output.put_line(rs.學號||','||rs.姓名||','||rs.平均分||','||rs.總分);
end loop;
end;

熱點內容
phpmyadminlinux安裝 發布:2024-03-29 17:13:15 瀏覽:792
python中replace 發布:2024-03-29 17:08:17 瀏覽:652
mdb導入sql 發布:2024-03-29 17:07:36 瀏覽:128
java資料庫工具類 發布:2024-03-29 16:31:15 瀏覽:388
安卓機哪裡看型號 發布:2024-03-29 15:59:40 瀏覽:281
cad解壓錯誤 發布:2024-03-29 15:01:45 瀏覽:79
存儲指令集 發布:2024-03-29 14:39:27 瀏覽:649
資料庫表刪除數據 發布:2024-03-29 14:39:26 瀏覽:367
出c語言整除 發布:2024-03-29 14:28:22 瀏覽:572
芬尼壓縮機 發布:2024-03-29 14:24:11 瀏覽:464