1. MYsql 存儲過程報錯Deadlock found when trying to get lock; try restarting transaction
這個死鎖估計是有數據沒了, 或者某個操作被回滾了
要避免這個問題方法有很多
事務盡量不要太復雜
在使用表或者行的時候, 盡量設定一個順序, 比如同一時間段線程A 競爭 1 2 資源, 線程 B 競爭 2 1 資源出現死鎖, 如果改成 A 使用 1 2 B 也是使用的 1 2 , 這樣再差也只會出現線程A/B去等待線程B/A執行完畢再去訪問資源
將一些容易出現死鎖的欄位改成索引, 這樣在競爭資源的時候mysql將不再上鎖[doge]
如果你是mysql資料庫, 則盡量避免使用 insert ... select 這樣的sql(oracle不用), 因為他會為你需要查詢的條件也上鎖, 這樣也會容易出現死鎖的問題
捕獲異常, 然後在出現這個異常的時候再次執行一次死鎖的sql語句
待續, 我也沒遇到更多的出現死鎖的情況了, 等遇到再說
以上幾點如果有錯的話, 請指出, 我們相互探討, 畢竟這也是我從筆記裡面找出來的, 可能有錯誤
2. Mysql存儲過程報錯: You have an error in your SQL syntax; check the manual that corresponds to you
1.提示是不支持的mysql命令,核對SQL語句,
2.還有就是select語句不要用單引號,這個是極容易犯的錯誤
3.查看你的欄位是否相對應;
4. into ',var_ids,' from ',par_statis,'這里的單引號和逗號全雲掉;
3. Mysql存儲過程報1064錯誤,提示語法錯誤
DELIMITER //
DROP PROCEDURE IF EXISTS count_role;
CREATE PROCEDURE `count_role`(in p_role_name varchar(20),out count_total int,out exe_date date)
BEGIN
select count(*) into count_total from t_role where role_name like '%' || p_role_name || '%';
select sysdate into exe_date from al;
END;
//
DELIMITER ;
4. mysql中存儲過程報錯
幫你改了一下
DELIMITER $$
create procere pplog.addUser()
begin
declare count1 int default 0;
if count1<1000000 then
set count1=count1+1;
insert into pplog.user_log_inf(infohash,filesize,userIp,start_time,end_time,download,total_visit,protocal)
values("3662HDSH",232,'10,23,351',"2010-04-15 10:13:04","2010-05-15 11:34:40",22,33,44);
else set count1=count1+10;
end if;
END$$
DELIMITER ;
5. 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; 結束出錯處理。
6. mysql存儲過程,錯誤1337 求教
報這個錯是因為游標沒有查詢到數據,所以循環遍歷時,就會報No data錯誤。可以在遍歷時,判斷不為空。
7. mysql的存儲過程問題 老是提示You have an error in your SQL syntax; check the manual that corresponds
存儲過程的語法錯了吧,第一句後面應該加個is或者as!
//是mysql裡面有時候用來執行命令的符號!
不過你這里好像不需要,因為存儲過程好象不是這樣可以執行的!
一般報這個錯都是因為語法有問題,或者符號!
8. mysql存儲過程報一下錯誤,不知道是這么回事,求幫助
create procere student()
begin
select stu_no from student; -- 加個分號
end;
-- 如果加了分號還不行的話抄,提示的錯誤應該是
錯誤:PLS-00428: 在此 SELECT 語句中缺少 INTO 子句
原因是單獨的一個襲select語句在存儲過程中是不應該存在的,所以應該改成select stu_no into 的模式
create procere student()
is
v_stu_no student.stu_no%TYE;
begin
select stu_no into v_stu_no from student where rownum <= 1; -- 改成select into 字句
end;
9. 我寫的這個mysql的存儲過程為什麼報no data錯誤
我寫的這個mysql的存儲過程為什麼報no data錯誤
報這個錯是因為游標沒有查詢到數據,所以循環遍歷時,就會報No data錯誤。
可以在遍歷時,判斷不為空。