mysql存储过程抛异常
加一个事务
多加几个判断就可以处理存储过程中的异常了,请采纳!
❷ 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;
随便输入点信息也是可以的。

❸ 如何Mysql触发器中抛出一个异常
从Mysql 5.5 开始为我们提供了SIGNAL函数来实现这个功能。
[sql] view plain
CREATE TRIGGER `tg_order_create` AFTER INSERT ON `tp_order` FOR EACH ROW BEGIN
DECLARE msg varchar(200);
/*冻结金额*/
IF 2=NEW.condition THEN
UPDATE `tp_user` SET `frozen_amount`=`frozen_amount`+NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` > NEW.amount;
/*如果余额不足,产生一个错误*/
IF ROW_COUNT() <> 1 THEN
set msg = "用户余额不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
/*扣除金额*/
ELSEIF 3=NEW.condition THEN
UPDATE `tp_user` SET `amount`=`amount`-NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` > NEW.amount;
/*如果余额不足,产生一个错误*/
IF ROW_COUNT() <> 1 THEN
set msg = "用户余额不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END IF;
END;
这里这条触发器的功能是库存操作,当库存足够的时候 减少库存,否则 抛出一个异常并报告商品库存不足:
[sql] view plain
CREATE TRIGGER `TG_order_detail_dec_stock` BEFORE INSERT ON `tp_order_detail` FOR EACH ROW BEGIN
DECLARE msg VARCHAR(200);
UPDATE `tp_stock` SET `num`=`num`-NEW.num WHERE `goods_id`=NEW.goods_id AND `mid`=NEW.mid AND `num`>=NEW.num;
IF ROW_COUNT() <> 1 THEN
SELECT CONCAT(`name`, ' 库存不足.') INTO msg FROM `tp_goods` WHERE `id`=NEW.goods_id;
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END;
在php端的处理(注:使用ThinkPHP框架):
[php] view plain
//前面省略若干行....
try {
if (false === ($order_pk = $tbl_order->add($order))) {
$tbl->rollback();
echo json_encode(array('success' => -1, 'message' => "创建订单失败!."), JSON_UNESCAPED_UNICODE);
return;
}
}catch (\PDOException $e){
$errInfo=$e->errorInfo[2];
$tbl->rollback();
echo json_encode(array('success' => -1, 'message' => "创建订单失败!,{$errInfo}"), JSON_UNESCAPED_UNICODE);
return;
}
//后面省略若干行....
❹ mybatis在mysql调用存储过程时为什么会出现以下错误
首先定义一个MySQL存储过程:
DROP PROCEDURE IF EXISTS test ;
CREATE PROCEDURE test (IN p1 VARCHAR(26), OUT pResult VARCHAR(512))
BEGIN
SET pResult := NULL;
SET pResult :=CONCAT ( 'test',p1);
SELECT * FROM tb2 WHERE commet lik Concat('%',p1, '%'); -- this 返回一个结果集
END;
tb2的表结构和数据如下:
DROP TABLE IF EXISTS `tb2`;
CREATE TABLE `tb2` (
`t_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`Name` varchar(255) DEFAULT NULL COMMENT '字段名',
`type` int(1) DEFAULT NULL COMMENT '类型,0-正常,1-异常,2-传输,3-退单',
`commet` varchar(255) DEFAULT NULL COMMENT '备注',
❺ mysql 存储过程 异常 是否自动 回滚
是滴,默认是隐式的开始与提交,出现异常会默认自动回滚到开始位置,任何一个使用JDBC操作数据库的SQL命令,在默认情况下,隐式开始与提交事务。当显示的调用事物时,就必须显示使用commit当使用rollback后也要进行commit;
❻ MySQL-python连接MySQL数据库问题,总是抛异常。
不要刚开始学多线程编程就这样玩。connection 和 cursor 都不是线程安全的。
如果测试环境用多个线程,每个线程要在线程里面获取自己的 connection,然后从这个connection 获取 cursor.
如果生产环境用多个线程,建议使用线程安全的连接池。
❼ MYSQL 存储过程 中怎么捕获异常
DECLARE处理程序的使用:
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错误代码也不被支持。
例:
[sql]viewplainprint?
delimiter$$
CREATETABLE`_t1`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`val1`varchar(20)DEFAULTNULL,
`val2`int(11)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=113DEFAULTCHARSET=latin1$$
[sql]viewplainprint?
DELIMITER$$
CREATEDEFINER=`abandonship`@`%`PROCEDURE`P_TestException`()
BEGIN
declare_var,_errintdefault0;
,sqlwarning,notfoundset_err=1;
insertinto_t1(val1,val2)value(2012,'abandonship');
if_err=1then
set_var=2;
endif;
selectcasewhen_var=2then'出错了'else_varend;
调用该存储过程将返回:出错了
❽ 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语句
待续, 我也没遇到更多的出现死锁的情况了, 等遇到再说
以上几点如果有错的话, 请指出, 我们相互探讨, 毕竟这也是我从笔记里面找出来的, 可能有错误
