sql抛出异常
㈠ 如何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;
}
//后面省略若干行....
㈡ sql server的error_message是干嘛用的
RAISERROR
返回用户定义的错误信息并设系统标志,记录发生错误。通过使用 RAISERROR 语句,客户端可以从 sysmessages 表中检索条目,或者使用用户指定的严重度和状态信息动态地生成一条消息。这条消息在定义后就作为服务器错误信息返回给客户端。
语法
RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
参数
msg_id
存储于 sysmessages 表中的用户定义的错误信息。用户定义错误信息的错误号应大于 50,000。由特殊消息产生的错误是第 50,000 号。
msg_str
是一条特殊消息,其格式与 C 语言中使用的 PRINTF 格式样式相似。此错误信息最多可包含 400 个字符。如果该信息包含的字符超过 400 个,则只能显示前 397 个并将添加一个省略号以表示该信息已被截断。所有特定消息的标准消息 ID 是 14,000。
msg_str 支持下面的格式:
% [[flag] [width] [precision] [{h | l}]] type
可在 msg_str 中使用的参数包括:
flag
用于确定用户定义的错误信息的间距和对齐的代码。
可以查阅一下SQL SERVER的联机丛书(在安装了MSSQL的开始菜单里可以查到)
㈢ 我用Java连接数据库,try Catch ,try执行sql语句都成功了,但是catch还是抛出异常,这是怎么回事
catch里面system.out.println(e); 这样可以打印出异常,打印出异常就一目了然了
㈣ 在sql里面raiserror有什么作用的啊
RAISERROR是抛出SQL语句异常或错误的关键字,在存储过程里经常用到。
用法:
使用RAISERROR后需带三个参数,分别如下:
RAISERROR(参数一,参数二,参数三)
参数一:提示出错信息
参数二:错误的状态
参数三:错误的级别
例如:RAISERROR('过程执行出错,行【100】',16,1),16为状态,级别1,错误信息为:过程执行出错,行【100】。
㈤ php sql 异常判断
可以使用 mysql_errno() 来判断上一条sql语句是否执行成功. 返回非0 都表示错误.
(若想获取错误的文本描述信息 , 可以使用 mysql_error() )
例子:
$资源句柄 = mysql_connect(....);
@mysql_query('abcdee' , $资源句柄);
var_mp(mysql_errno($资源句柄));
var_mp(mysql_error($资源句柄));
================================
实现判断语句是否正确. 那就得在拼接sql的时候下功夫.
如果把字段值的验证与过滤做到位了.
那拼接出来的sql 不会有问题的.