暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

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

原创 李宏达 2022-01-11
1985

1. 异构迁移

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

2. mtk迁移

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

逻辑对象统计如下
image.png

MTK 截图部分展示
image.png

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

3. 函数重载

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

MogDB 存储过程支持重载功能

image.png

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属性的存储过程时,创建重载存储过程会报错。
最后修改时间:2022-01-12 09:22:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论