[MySQL] 存储过程错误异常处理例子 --> DECLARE EXIT HANDLER FOR SQLEXCEPTION

本文提供了一个MySQL存储过程的示例,展示了如何使用错误处理机制和数据替换操作来完成特定任务,这对于熟悉SQL Server背景并寻找MySQL中类似退出执行方法的开发者来说非常有用。

刚才一个朋友问到:

mysql有类似mssql退出执行的方法不?
比如我执行到某个条件,下面就终止执行了。

想起以前写的存储过程,找了好久才找到,就发给他,希望对他有所帮助,贴在这里,留作纪念,也方便自己以后查找。


-- --------------------------------------------------------------------------------

-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$


CREATE PROCEDURE xxx.proc_reuters_dss_equity_price(OUT p_result BOOLEAN)
BEGIN
-- 错误处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
TRUNCATE TABLE reuters_interface.reuters_dss_equity_price;
SET p_result = FALSE;
END;

-- 处理数据
REPLACE INTO reuters_dss.equity_price (ric, company_name, currency_code, exchange_code, ticker, trade_date, ask_price, bid_price,
close_price, volume, last_updated_ask_price, last_updated_bid_price, last_updated_close_price, last_updated_date, last_updated_volume, split_factor, vwap_price,
insert_time)
SELECT ric, IF(company_name='', null, company_name), currency_code, exchange_code, ticker, trade_date, IF(ask_price='0.00000', null, ask_price),
IF(bid_price='0.00000', null, bid_price), close_price, IF(volume='0', null, volume), IF(last_updated_ask_price='0.00000', null, last_updated_ask_price),
IF(last_updated_bid_price='0.00000', null, last_updated_bid_price),
IF(last_updated_close_price='0.00000', null, last_updated_close_price),
last_updated_close_price_date,
IF(last_updated_volume='0', null, last_updated_volume),
IF(split_factor='', null, split_factor),
IF(vwap_price='0.00000', null, vwap_price),
insert_time
FROM reuters_interface.reuters_dss_equity_price;

COMMIT;

TRUNCATE TABLE reuters_interface.reuters_dss_equity_price;
SET p_result = TRUE;

COMMIT;


END



DROP TRIGGER IF EXISTS tr_ai_check_under_400; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> mysql> DELIMITER $$ mysql> mysql> CREATE DEFINER=`root`@`localhost` TRIGGER `tr_ai_check_under_400` -> AFTER UPDATE ON `ai_appsortingtaskskus` -> FOR EACH ROW -> BEGIN -> -> DECLARE v_line_number INT; -> DECLARE v_waybill_id VARCHAR(20); -> DECLARE v_qty_sum INT DEFAULT 0; -> DECLARE v_next_waybill_id VARCHAR(20); -> DECLARE no_data BOOLEAN DEFAULT FALSE; -> -> -- 局部异常处理 -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_data = TRUE; -> DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; END; -> -> -- 判断是否为首次更新 LastModificationTime -> IF OLD.LastModificationTime IS NULL AND NEW.LastModificationTime IS NOT NULL THEN -> -> main_logic: BEGIN -- ← 给这个块加个名字 -> -> -- 获取当前 Item 对应的 LineNumber 和 WaybillId -> SELECT -> NEW.LineNumber, -> t.WaybillId -> INTO -> v_line_number, v_waybill_id -> FROM -> ai_appsortingtaskitems i -> INNER JOIN -> ai_appsortingtasks t ON i.TaskId = t.Id -> WHERE -> i.Id = NEW.ItemId -> AND t.IsDeleted = 0 -> AND t.Status = 2; -> -> -- 如果没查到有效信息,直接退出 -> IF no_data OR v_line_number IS NULL THEN -> SET no_data = FALSE; -- 重置标志 -> LEAVE main_logic; -- ✅ 正确:跳出自定义块 -> END IF; -> SET no_data = FALSE; -- 重置 -> -> -- 检查该线路是否有待分配的波次号 -> SELECT NextWaybillId INTO v_next_waybill_id -> FROM ai_devicestatus -> WHERE LineNumber = v_line_number -> FOR UPDATE; -> -> -- 如果已经有计划波次号,则无需重新分配 -> IF v_next_waybill_id IS NULL THEN -> -> -- 统计该线路下所有未完成排号的 SKU 数量 -> SELECT COALESCE(SUM(sku.Qty), 0) -> INTO v_qty_sum -> FROM ai_appsortingtaskskus sku -> INNER JOIN ai_appsortingtaskitems item ON sku.ItemId = item.Id -> INNER JOIN ai_appsortingtasks task ON item.TaskId = task.Id -> WHERE -> task.IsDeleted = 0 -> AND task.Status = 2 -> AND sku.LastModificationTime IS NULL -> AND sku.LineNumber = v_line_number; -> -> -- 若总量小于等于 400,尝试分配计划波次号 -> IF v_qty_sum <= 400 THEN -> -> -- 分配下一个有效的 DocNo(大于历史最大值,且未被占用) -> SELECT d.DocNo INTO v_next_waybill_id -> FROM b_dock d -> WHERE -> d.ReviewType = 1 -> AND d.IsDeleted = 0 -> AND d.DocNo > ( -> SELECT MAX(WaybillId) -> FROM ai_appsortingtasks -> WHERE IsDeleted = 0 AND Status = 2 -> ) -> AND NOT EXISTS ( -> SELECT 1 FROM ai_devicestatus ds -> WHERE ds.NextWaybillId = d.DocNo -> ) -> ORDER BY d.DocNo ASC -> LIMIT 1; -> -> -- 若成功获取新运单号,则更新设备状态 -> IF v_next_waybill_id IS NOT NULL THEN -> UPDATE ai_devicestatus -> SET NextWaybillId = v_next_waybill_id -> WHERE LineNumber = v_line_number AND Status = 1; -> END IF; -> -> END IF; -- v_qty_sum <= 400 -> -> END IF; -- v_next_waybill_id IS NULL -> -> END main_logic; -- ✅ 必须与 label 名称一致 -> -> END IF; -> -> END$$ ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored function or trigger. mysql> mysql> DELIMITER ; mysql>
最新发布
10-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值