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错误。
可以在遍历时,判断不为空。