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的工具。
逻辑对象统计如下
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的工具。
逻辑对象统计如下
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