ODC导出存储过程,参数顺序不一致

【 使用环境 】生产环境
【 OB or 其他组件 】 版本号:ODC:4.1.0 Release Date: 2023-01-18
【 使用版本 】oceanbase:5.7.25-OceanBase_CE-v4.0.0.0
【问题描述】ODC导出OB存储过程,参数位置不一致
【复现路径】ODC > 导出>新建导出-仅导出存储过程>导出
【问题现象及影响】
导出的内容

DELIMITER $$
CREATE PROCEDURE create_number_month_partition (IN in_table_name varchar(64), IN in_database_name varchar(64))
BEGIN

– 省略具体代码

END
$$

存储过程真正的内容

两个参数顺序是反的
【附件】

确认是问题,可以在github上提个单吗?方便后续优化

请问下github地址可以发一下吗

你好,方便提供下全部语句吗?

obdumper是下载的社区办官网最新的
目前能复现是存储过程中有以下两个存储过程的时候 就会出现参数顺序不一致
今天用obdumper复现的。
./obdumper -h -P 2883 -u '’ --tenant ‘’ -p '’ -c obcluster -D test_db_20230301 --procedure ‘*’ --ddl --file-path /root/dbbakoutput/13

单独导出是不会的
./obdumper -h -P 2883 -u '’ --tenant ‘’ -p '’ -c obcluster -D test_db_20230301 --procedure ‘create_number_month_partition’ --ddl --file-path /root/dbbakoutput/13

CREATE DEFINER = root@% PROCEDURE test_db_20230301.create_number_month_partition
(
IN in_database_name varchar(64), IN in_table_name varchar(64)
) BEGIN
– 自动分区创建存储过程, 需要传入表名, 表需要预先创建分区, 分区的格式为pYYYYMM才能支持自动分区, 如p202107
– 数据库名
DECLARE database_name varchar(64);
– 表名
DECLARE table_name varchar(64);
– 最近一次分区的名称
DECLARE p_last_name varchar(20);
– 最近一次分区的时间
DECLARE p_last_date date;
– 最近一次分区的时间
DECLARE p_last_date_str varchar(20);
– 最近一次分区的时间搓
DECLARE p_last_less_unix_time_date BIGINT;
– 最近一次分区的年月, 用于计算月份间隔, 格式yyyyMM
DECLARE p_last_year_month_day varchar(10);
– 当前年月, 用于计算月份间隔, 格式yyyyMM
DECLARE now_year_month_day varchar(10);

SET table_name = in_table_name;
SET database_name = in_database_name;

– 查询最近一次的分区名称
SET @find_partition = CONCAT(‘SELECT partition_name INTO @p_last_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ‘’’, database_name, ‘’’ AND TABLE_NAME = ‘’’, table_name,’’’ ORDER BY partition_ordinal_position DESC LIMIT 1;’);
PREPARE stmt1 FROM @find_partition;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

SET p_last_name = @p_last_name;

– 将最近一次的分区名称转换为日期
SET p_last_date = DATE_FORMAT(CONCAT( REPLACE(REPLACE(p_last_name, ‘’’’, ‘’), ‘p’, ‘’), “01”), ‘%Y%m%d’);

– 获取最近一次的分区时间格式yyyyMM
SET p_last_year_month_day = DATE_FORMAT(p_last_date, ‘%Y%m’);

– 获取当前时间格式yyyyMMdd, 由于分区使用的是less than, 分区p20210701保存的是7月1号的数据, 需要提前为下月的数据创建分区,所以这里增加3天,防止数据跨日时没有分区导致数据添加不进来
– 这里也是用来控制提前新增的分区数量的
SET now_year_month_day = DATE_FORMAT(DATE_ADD(curdate(), interval 2 MONTH), ‘%Y%m’);

IF PERIOD_DIFF(now_year_month_day, p_last_year_month_day) > 0 THEN
– 将分区日期增加一个月, 新增分区时间
SET p_last_date = DATE_ADD(p_last_date, interval 1 MONTH);

SET p_last_date_str = DATE_FORMAT(p_last_date, '%Y%m');
 
SET p_last_less_unix_time_date = UNIX_TIMESTAMP(DATE_ADD(p_last_date, interval 1 MONTH));

SET @add_partition = CONCAT(‘alter table ‘, table_name,’ add partition (partition ', concat('p', p_last_date_str),' VALUES LESS than(’, p_last_less_unix_time_date, ‘))’);
PREPARE stmt FROM @add_partition;

  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END IF;
END

CREATE DEFINER = root@% PROCEDURE test_db_20230301.create_number_partition
(
IN in_database_name varchar(64), IN in_table_name varchar(64)
) BEGIN
– 自动分区创建存储过程, 需要传入表名, 表需要预先创建分区, 分区的格式为pYYYYMMdd才能支持自动分区, 如p20210724
– 数据库名
DECLARE database_name varchar(64);
– 表名
DECLARE table_name varchar(64);
– 最近一次分区的名称
DECLARE p_last_name varchar(20);
– 最近一次分区的时间
DECLARE p_last_date date;
– 最近一次分区的时间
DECLARE p_last_date_str varchar(20);
– 最近一次分区的时间搓
DECLARE p_last_less_unix_time_date BIGINT;
– 最近一次分区的年月, 用于计算月份间隔, 格式yyyyMMdd
DECLARE p_last_year_month_day varchar(10);
– 当前年月, 用于计算月份间隔, 格式yyyyMMdd
DECLARE now_year_month_day varchar(10);

SET table_name = in_table_name;
SET database_name = in_database_name;

– 查询最近一次的分区名称
SET @find_partition = CONCAT(‘SELECT partition_name INTO @p_last_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ‘’’, database_name, ‘’’ AND TABLE_NAME = ‘’’, table_name,’’’ ORDER BY partition_ordinal_position DESC LIMIT 1;’);
PREPARE stmt1 FROM @find_partition;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

SET p_last_name = @p_last_name;

– 将最近一次的分区名称转换为日期
SET p_last_date = DATE_FORMAT(REPLACE(REPLACE(p_last_name, ‘’’’, ‘’), ‘p’, ‘’), ‘%Y%m%d’);

– 获取最近一次的分区时间格式yyyyMM
SET p_last_year_month_day = DATE_FORMAT(p_last_date, ‘%Y%m%d’);

– 获取当前时间格式yyyyMMdd, 由于分区使用的是less than, 分区p20210701保存的是7月1号的数据, 需要提前为下月的数据创建分区,所以这里增加3天,防止数据跨日时没有分区导致数据添加不进来
– 这里也是用来控制提前新增的分区数量的
SET now_year_month_day = DATE_FORMAT(DATE_ADD(curdate(), interval 2 DAY), ‘%Y%m%d’);

IF DATEDIFF(now_year_month_day, p_last_year_month_day) > 0 THEN
– 将分区日期增加一个月, 新增分区时间
SET p_last_date = DATE_FORMAT(DATE_ADD(p_last_date, interval 1 DAY), ‘%Y%m%d’);

SET p_last_date_str = DATE_FORMAT(p_last_date, '%Y%m%d');
 
SET p_last_less_unix_time_date = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD(p_last_date, interval 1 DAY), '%Y%m%d'));

SET @add_partition = CONCAT(‘alter table ‘, table_name,’ add partition (partition ', concat('p', p_last_date_str),' VALUES LESS than(’, p_last_less_unix_time_date, ‘))’);
PREPARE stmt FROM @add_partition;

  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END IF;
END