openGauss MogDB 迁移适配——存储过程重载

2023年 9月 25日 90.7k 0

1. 异构迁移

在给某金融级客户迁移时遇到了各种各样的兼容性问题,本次迁移涉及到多个存储过程的适配,DB2到MogDB,这里做一个简单的整理。

2. mtk迁移

mtk全称为 The Database Migration Toolkit,是一个云和恩墨自主研发的可以将Oracle/DB2/MySQL/openGauss数据库的数据结构,全量数据高速导入到MogDB的工具。

逻辑对象统计如下

MTK 截图部分展示

其中两次迁移对比发现存储过程少了7个,去源端查询发现有7个完全同名的存储过程,即存在存储过程重载现象。

3. 函数重载

多个函数具有相同的名称,只要参数不同即可。如果多个函数具有相同的名称,那么我们说这些函数是重载的。当一个函数被调用时,根据输入参数调用确切的函数,存储过程也是一样的原理。

MogDB 存储过程支持重载功能

4. 存储过程重载操作

  • 创建

postgres=> create or replace procedure procedure1(p1 text, out p2 text)
postgres-> package
postgres-> as Declare
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> /
CREATE PROCEDURE
postgres=> create or replace procedure procedure1(p1 integer, out p2 text)
postgres-> package
postgres-> as Declare
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> /
CREATE PROCEDURE
postgres=> df procedure1
List of functions
Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind
--------+------------+------------------+-------------------------+--------+------------+------------+---------
lee | procedure1 | text | p1 integer, OUT p2 text | normal | f | t | p
lee | procedure1 | text | p1 text, OUT p2 text | normal | f | t | p
(2 rows)

postgres=>

  • 删除

postgres=> drop procedure procedure1;
ERROR: function procedure1 asks parameters
postgres=> drop procedure procedure1(text);
DROP PROCEDURE
postgres=> df procedure1
List of functions
Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind
--------+------------+------------------+-------------------------+--------+------------+------------+---------
lee | procedure1 | text | p1 integer, OUT p2 text | normal | f | t | p
(1 row)

postgres=> drop procedure procedure1(integer);
DROP PROCEDURE
postgres=> df procedure1
List of functions
Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind
--------+------+------------------+---------------------+------+------------+------------+---------
(0 rows)

  • 首次创建时不带package属性,再使用带package属性去重载时会创建失败

postgres=> create or replace procedure procedure1(p1 text, out p2 text)
postgres-> as Declare
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> /
CREATE PROCEDURE
postgres=> create or replace procedure procedure1(p1 text, out p2 text)
postgres-> package
postgres-> as Declare
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> /
ERROR: Do not allow package function replace not package function.

  • 当有同名函数存在时创建报错

postgres=> CREATE OR REPLACE FUNCTION procedure1(p_timestamp timestamp with time zone)
postgres-> RETURNS integer
postgres-> LANGUAGE sql
postgres-> NOT FENCED NOT SHIPPABLE
postgres-> AS $function$
postgres$> select (extract('day' from (p_timestamp - '0001-01-01bc'))-365)::integer;
postgres$> $function$;
CREATE FUNCTION
postgres=>
postgres=> create or replace procedure procedure1(p1 text, out p2 text)
postgres-> package
postgres-> as Declare
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> /
ERROR: Do not allow package function replace not package function.

5. 存储过程修改为函数

postgres=> create or replace procedure procedure1(p1 text, out p2 text)
postgres-> package
postgres-> as Declare
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> /
CREATE PROCEDURE
postgres=> drop procedure procedure1 (text);
DROP PROCEDURE

postgres=> create or replace function procedure1(p1 text, out p2 text)
postgres-> returns void
postgres-> as $$
postgres$> BEGIN
postgres$> p2 = concat('procedure parameter: p1,a');
postgres$> end;
postgres$> $$
postgres-> language plpgsql;
CREATE FUNCTION

6. 总结

  • MogDB、openGauss支持存储过程的重载。
  • 删除重载属性的存储过程需要传入相应参数。
  • 创建重载属性的存储过程需要在as前加上package关键字。
  • 当同schema下有同名的函数或者不带package属性的存储过程时,创建重载存储过程会报错。

    1. 异构迁移

    在给某金融级客户迁移时遇到了各种各样的兼容性问题,本次迁移涉及到多个存储过程的适配,DB2到MogDB,这里做一个简单的整理。

    2. mtk迁移

    mtk全称为 The Database Migration Toolkit,是一个云和恩墨自主研发的可以将Oracle/DB2/MySQL/openGauss数据库的数据结构,全量数据高速导入到MogDB的工具。

    逻辑对象统计如下
    openGauss MogDB 迁移适配——存储过程重载-1

    MTK 截图部分展示
    openGauss MogDB 迁移适配——存储过程重载-2

    其中两次迁移对比发现存储过程少了7个,去源端查询发现有7个完全同名的存储过程,即存在存储过程重载现象。

    3. 函数重载

    多个函数具有相同的名称,只要参数不同即可。如果多个函数具有相同的名称,那么我们说这些函数是重载的。当一个函数被调用时,根据输入参数调用确切的函数,存储过程也是一样的原理。

    MogDB 存储过程支持重载功能

    openGauss MogDB 迁移适配——存储过程重载-3

    4. 存储过程重载操作

    • 创建

    postgres=> create or replace procedure procedure1(p1 text, out p2 text)
    postgres-> package
    postgres-> as Declare
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> /
    CREATE PROCEDURE
    postgres=> create or replace procedure procedure1(p1 integer, out p2 text)
    postgres-> package
    postgres-> as Declare
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> /
    CREATE PROCEDURE
    postgres=> df procedure1
    List of functions
    Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind
    --------+------------+------------------+-------------------------+--------+------------+------------+---------
    lee | procedure1 | text | p1 integer, OUT p2 text | normal | f | t | p
    lee | procedure1 | text | p1 text, OUT p2 text | normal | f | t | p
    (2 rows)

    postgres=>

    • 删除

    postgres=> drop procedure procedure1;
    ERROR: function procedure1 asks parameters
    postgres=> drop procedure procedure1(text);
    DROP PROCEDURE
    postgres=> df procedure1
    List of functions
    Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind
    --------+------------+------------------+-------------------------+--------+------------+------------+---------
    lee | procedure1 | text | p1 integer, OUT p2 text | normal | f | t | p
    (1 row)

    postgres=> drop procedure procedure1(integer);
    DROP PROCEDURE
    postgres=> df procedure1
    List of functions
    Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind
    --------+------+------------------+---------------------+------+------------+------------+---------
    (0 rows)

    • 首次创建时不带package属性,再使用带package属性去重载时会创建失败

    postgres=> create or replace procedure procedure1(p1 text, out p2 text)
    postgres-> as Declare
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> /
    CREATE PROCEDURE
    postgres=> create or replace procedure procedure1(p1 text, out p2 text)
    postgres-> package
    postgres-> as Declare
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> /
    ERROR: Do not allow package function replace not package function.

    • 当有同名函数存在时创建报错

    postgres=> CREATE OR REPLACE FUNCTION procedure1(p_timestamp timestamp with time zone)
    postgres-> RETURNS integer
    postgres-> LANGUAGE sql
    postgres-> NOT FENCED NOT SHIPPABLE
    postgres-> AS $function$
    postgres$> select (extract('day' from (p_timestamp - '0001-01-01bc'))-365)::integer;
    postgres$> $function$;
    CREATE FUNCTION
    postgres=>
    postgres=> create or replace procedure procedure1(p1 text, out p2 text)
    postgres-> package
    postgres-> as Declare
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> /
    ERROR: Do not allow package function replace not package function.

    5. 存储过程修改为函数

    postgres=> create or replace procedure procedure1(p1 text, out p2 text)
    postgres-> package
    postgres-> as Declare
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> /
    CREATE PROCEDURE
    postgres=> drop procedure procedure1 (text);
    DROP PROCEDURE

    postgres=> create or replace function procedure1(p1 text, out p2 text)
    postgres-> returns void
    postgres-> as $$
    postgres$> BEGIN
    postgres$> p2 = concat('procedure parameter: p1,a');
    postgres$> end;
    postgres$> $$
    postgres-> language plpgsql;
    CREATE FUNCTION

    6. 总结

    • MogDB、openGauss支持存储过程的重载。
    • 删除重载属性的存储过程需要传入相应参数。
    • 创建重载属性的存储过程需要在as前加上package关键字。
    • 当同schema下有同名的函数或者不带package属性的存储过程时,创建重载存储过程会报错。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论