前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MariaDB 10.0 和 MariaDB 10.1 存储过程中 PREPARE FROM EXECUTE 区别

MariaDB 10.0 和 MariaDB 10.1 存储过程中 PREPARE FROM EXECUTE 区别

作者头像
星哥玩云
发布2022-08-16 15:02:05
5830
发布2022-08-16 15:02:05
举报
文章被收录于专栏:开源部署

前景:

  有一个更新表分区的存储过程,在MariaDB10.1.12下,是能正常运行的。某些业务要求,我同步了这个存储过程到另一台服务器的数据库中,版本为MariaDB10.0.19,这个存储过程执行报错!

  存储过程如下:

 CREATE  PROCEDURE `proc_accesslog_partition_add`(in dbname VARCHAR(20), in tablename VARCHAR(30), in accdate VARCHAR(20))

BEGIN -- dbname 数据库名;tablename:表名;accdate:日期 DECLARE conditionSql VARCHAR(2000);  DECLARE alterStr VARCHAR(1000);  SET conditionSql = CONCAT("SELECT * FROM information_schema.partitions where table_schema='",dbname,"' and table_name='",tablename,"' AND PARTITION_NAME='p",accdate,"'");  SET alterStr = CONCAT("ALTER TABLE ",tablename," ADD PARTITION (PARTITION p",accdate," VALUES LESS THAN (TO_DAYS('",accdate,"')))");

 SET @STR=CONCAT("IF NOT EXISTS(",conditionSql,") THEN ",alterStr,";END IF;");  PREPARE mainStmt FROM @STR;  EXECUTE mainStmt;

END

  在10.1下,这个过程是能正常执行的。

  但是在10.0下,它会抱如下错误:

[SQL]CALL proc_test('ad_warehouse','t_access_log_30','20160323'); [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'IF NOT EXISTS(SELECT * FROM information_schema.partitions where table_schema='a' at line 1

MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;

  重新修改存储过程:

BEGIN -- dbname 数据库名;tablename:表名;accdate:日期 DECLARE num INT;  SET @if_sql = CONCAT("SELECT count(*) INTO @record FROM information_schema.partitions where table_schema='",dbname,"' and table_name='",tablename,"' AND PARTITION_NAME='p",accdate,"'");  SET @alter_sql = CONCAT("ALTER TABLE ",tablename," ADD PARTITION (PARTITION p",accdate," VALUES LESS THAN (TO_DAYS('",accdate,"')))");  PREPARE ifStmt FROM @if_sql;  EXECUTE ifStmt;  deallocate prepare ifStmt;

 SET num=@record;  IF num=0 THEN  PREPARE alterStmt FROM @alter_sql;  EXECUTE alterStmt;  deallocate prepare alterStmt;  END IF;

END

  这个过程能在10.0和10.1下执行成功。

  这个结果说明

    1、mariaDB10.0 的prepare from execute语法中,preparable_SQL_statement只支持简单的SQL语句,不支持if exists 等复杂语句。

    2、动态SQL语法执行,需要PREPARE FROM EXECUTE 来实现。

    3、在存储过程需要获取上一个结果作为条件,用INTO,但有一点需要记住,EXECUTE只把@开头的当做参数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档