mysql数据库到pg数据库迁移问题

最近公司在进行去O改造,所以涉及到把原来的oracle数据库等东西转移到pg数据库。今天记得是pg数据库建表的记录。建表没什么难的用数据库客户端就可以完成。我遇到的问题是pg数据库自定义函数和存储过程的问题。
首先是mysql的自定义函数:

DROP FUNCTION IF EXISTS `getAreaChildList`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `getAreaChildList`(`areaId` longtext) RETURNS varchar(1000) CHARSET utf8 COLLATE utf8_bin
BEGIN
	 DECLARE sTemp VARCHAR(1000);
   DECLARE sTempChd VARCHAR(1000);
   SET sTemp = '$';
   SET sTempChd =cast(areaId as CHAR);
     WHILE sTempChd is not null DO
       SET sTemp = concat(sTemp,',',sTempChd);
       SELECT group_concat(area_id) INTO sTempChd FROM sys_area where FIND_IN_SET(par_area_id,sTempChd)>0;
      END WHILE;
      RETURN sTemp;
END
;;
DELIMITER ;

首先把代码理解下:
1.DELIMITER ;;这个是分解符标识开始自定义函数的过程。
2.CREATE DEFINER=root@% FUNCTION getAreaChildList(areaId longtext) 这个是为这个数据库的用户定义的一个函数,传入的参数是areaId,类型为longtext。
3.RETURNS varchar(1000) CHARSET utf8 COLLATE utf8_bin返回值类型是varchar(1000)还有定义字符集
4.函数体:

BEGIN
	 DECLARE sTemp VARCHAR(1000);
   DECLARE sTempChd VARCHAR(1000);
   SET sTemp = '$';
   SET sTempChd =cast(areaId as CHAR);
     WHILE sTempChd is not null DO
       SET sTemp = concat(sTemp,',',sTempChd);
       SELECT group_concat(area_id) INTO sTempChd FROM sys_area where FIND_IN_SET(par_area_id,sTempChd)>0;
      END WHILE;
      RETURN sTemp;
END

声明变量:sTemp和sTempChd。分别是varchar(1000)。set是赋值语句。
cast是一个类型转换函数。
while循环函数。concat()是字符串拼接函数。select b into a from e是一个语法。意思是e取出b放到a中。
group_concat(area_id)函数:拼接area_id
FIND_IN_SET()函数par_area_id 在sTempChd中的位置。
在pg数据库想实现这个功能我用的是navicat连接pg数据库,用创建函数的。有一个坑就是。当你创建号函数,开始写里面的逻辑代码的时候是这样的:
在这里插入图片描述
但是有个问题,如果想声明变量必须在begin前面。这一点跟mysql不一样。如果在begin后面声明是没用的。
pg数据库的赋值语句也跟mysql不同。是使用:=来赋值的。例如sTemp:=’$’。
使用循环的话不能直接使用: WHILE sTempChd is not null DO来开始循环。需要将DO去掉并使用LOOP来开始循环。并且循环结束之后要使用
END LOOP结束循环。
pg数据库拼接字符使用||来拼接。比如:sTemp:=sTemp||’,’||sTempChd;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值