最近公司在进行去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;