【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
1.【YashanDB知识库】yasql执行报错2.【YashanDB知识库】YCM Monit进程频繁误告警3.【YashanDB知识库】ycm托管主机报错libnsl.so.1 no such file or directory4.【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid5.【YashanDB知识库】调用外部UDF未能识别Java环境配置6.【YashanDB知识库】个别数据库用户无法登录数据库,报错 io fail:IO.EOF7.【YashanDB知识库】过期统计信息导致SQL执行计划变差8.【YashanDB知识库】隐藏参数怎么查看初始值9.【YashanDB知识库】原生mysql驱动配置连接崖山数据库10.【YashanDB知识库】yashandb升级后,yasboot restart出现版本回退、报错control file version incompatible11.【YashanDB知识库】解压安装包时报错"tar:Error is not recoverable"12.【YashanDB知识库】如何使用MySQL客户端链接YashanDB13.【YashanDB知识库】YashanDB 单机一主一备自动切换14.【YashanDB知识库】YashanDB到YashanDB手工元数据迁移15.【YashanDB知识库】YFS_修改AU_SIZE参数16.【YashanDB知识库】YashanDB备份恢复的两种渠道17.【YashanDB知识库】YashanDB获取统计信息18.【YashanDB知识库】关于表空间压缩19.【YashanDB知识库】如何更改自动统计信息收集任务20.【YashanDB知识库】如何利用数据库线程池稳定TP吞吐21.【YashanDB知识库】为什么YashanDB只有Geometry类型,没有Geogrephy类型22.【YashanDB知识库】用crontab实现YashanDB自动备份23.【YashanDB知识库】YashanDB与Oracle数据类型对齐24.【YashanDB知识库】多csv文件一键式导入yashandb25.【YashanDB知识库】手工迁移Doris数据到崖山分布式26.【YashanDB知识库】锁冲突检查27.【YashanDB知识库】重装新库及元数据和数据导出导入指导28.【YashanDB知识库】Mybatis-Plus适配崖山配置29.【YashanDB知识库】WAS配置YashanDB JDBC连接30.【YashanDB知识库】YashanDB安全设置示例31.【YashanDB知识库】YashanDB查询时间与实际时间默认少8小时32.【YashanDB知识库】Yasldr错误处理33.【YashanDB知识库】YCM和YMP密码重置34.【YashanDB知识库】YCM数据库托管遇到的问题35.【YashanDB知识库】备库扩缩容指导36.【YashanDB知识库】非YCM方式的自动备份方案示例37.【YashanDB知识库】归档日志清理38.【YashanDB知识库】私有maven使用崖山JDBC驱动39.【YashanDB知识库】通过导入导出修改用户名称40.【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB41.【YashanDB知识库】透明故障转移配置指导42.【YashanDB知识库】MySQL的FIND_IN_SET如何在YashanDB改写43.【YashanDB知识库】对比Oracle和YashanDB对象不一致的方法44.【YashanDB知识库】MySQL的FROM_UNIXTIME和UNIX_TIMESTAMP如何在YashanDB改写45.【YashanDB知识库】YMP从oracle到yashan迁移评估报OCI相关错误46.【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉47.【YashanDB 知识库】DolphinScheduler 适配崖山 Python 驱动48.【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山49.【YashanDB知识库】Kettle迁移MySQL到YashanDB50.【YashanDB知识库】Kettle迁移PostgreSQL到YashanDB51.【YashanDB知识库】MySQL返回结果集的存储过程的改写方法52.【YashanDB知识库】沙箱备库53.【YashanDB知识库】DataX迁移Hive到崖山分布式54.【YashanDB知识库】Springboot启动找不到崖山jdbc驱动的问题处理55.【YashanDB知识库】分布式LSC表修改字段56.【YashanDB知识库】扩展redo大小57.【YashanDB知识库】共享超过32000字节字符串插入CLOB类型方案58.【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法59.【YashanDB知识库】数据库升级后用yasboot在线扩充备节点出现报错
60.【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
61.【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警62.【YashanDB知识库】MySQL field 函数的改写方法63.【YashanDB知识库】MySQL和YashanDB 隐式转换不一致引起的报错64.【YashanDB知识库】YashanDB 支持MySQL多表更新语句的解决方法65.【YashanDB知识库】从PostgreSQL迁移到YashanDB如何进行数据行数比对66.【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute67.【YashanDB知识库】如何从内存中获取SQL语句的执行计划68.两个案例带你看懂YashanDB执行计划69.YashanDB物理规格70.YashanDB逻辑规格71.YashanDB数据类型规格72.YashanDB与Oracle兼容性说明73.YashanDB个人版、标准版和企业版功能差异74.YashanDB体系架构75.YashanDB存储引擎76.YashanDB SQL引擎77.YashanDB PL引擎78.YashanDB主备高可用79.YashanDB共享集群80.YashanDB实例架构81.YashanDB数据库实例82.YashanDB内存体系83.YashanDB进程线程体系本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7575253.html?templateId=1718516
MySQL的CONTINUE HANDLER
迁移MySQL业务时,遇到了MySQL的CONTINUE HANDLER FOR not found用法。详情如下:
-- 表DDL
create table t1(c1 int primary key, c2 int);
create table t2(c1 int primary key, c2 int);
-- 数据
insert into t1 values(1,1),(2,2);
insert into t2 values(1,11);
commit;
-- 使用CONTINUE HANDLER的存储过程
DELIMITER $$
CREATE PROCEDURE demo(IN p1 int)
BEGIN
DECLARE s bigint DEFAULT 0;
DECLARE v1 bigint DEFAULT 0;
DECLARE v2 bigint DEFAULT 0;
DECLARE cur1 CURSOR FOR select c2 from t1 where c1=p1;
DECLARE CONTINUE HANDLER FOR not found SET s=1;
OPEN cur1;
r_loop: LOOP
IF s = 1 THEN
LEAVE r_loop;
END IF;
-- 如果游标fetch结果not found,则设置s=1
FETCH cur1 INTO v1;
IF s = 0 THEN
-- 如果查询结果not found,则设置s=1
select c2 into v2 from t2 where c1=v1;
-- 调试:输出v2值
select v2;
-- 调试:输出s值
select s;
END IF;
END LOOP r_loop;
CLOSE cur1;
END$$
DELIMITER ;
执行效果如下:
mysql> CALL DEMO(1);
+------+
| v2 |
+------+
| 11 |
+------+
1 row in set (0.00 sec)
+------+
| s |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> CALL DEMO(2);
+------+
| v2 |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
+------+
| s |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> CALL DEMO(3);
Query OK, 0 rows affected (0.00 sec)
YashanDB的改写方法
MySQL的CONTINUE HANDLER需要在YashanDB进行改写。改写原则:1)对于游标的执行,需要使用游标属性%notfound来改写;2)对于select语句的执行,则需要通过NO_DATA_FOUND的异常处理来改写。例如,以上示例的改写详情如下:
CREATE OR REPLACE PROCEDURE demo(p1 IN int) IS
s bigint DEFAULT 0;
v1 bigint DEFAULT 0;
v2 bigint DEFAULT 0;
CURSOR cur1 is select c2 from t1 where c1=p1;
BEGIN
OPEN cur1;
<<r_loop>>
LOOP
IF s = 1 THEN
EXIT r_loop;
END IF;
-- 如果游标fetch结果not found,则设置s=1
FETCH cur1 INTO v1;
IF cur1%notfound THEN
s :=1 ;
END IF;
IF s = 0 THEN
-- 如果查询结果not found,则设置s=1
BEGIN
select c2 into v2 from t2 where c1=v1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
s :=1 ;
END;
-- 调试:输出v2值
DBMS_OUTPUT.PUT_LINE(v2);
-- 调试:输出s值
DBMS_OUTPUT.PUT_LINE(s);
END IF;
END LOOP r_loop;
CLOSE cur1;
END;
/
YashanDB的执行效果
改写后的执行效果如下:
SQL> SET SERVEROUTPUT ON
SQL> CALL DEMO(1);
11
0
PL/SQL Succeed.
SQL> CALL DEMO(2);
0
1
PL/SQL Succeed.
SQL> CALL DEMO(3);
PL/SQL Succeed.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体