用于为测试库生成随机的姓名。
生成的姓名基本能看,且一般能一眼看出不是正常的姓名,主要用于在系统测试时灌入测试数据,或用于覆盖现场正式数据为测试数据。
可以避免发生张飞、赵云、李世民在你的系统里出现的情况。
CREATE OR REPLACE FUNCTION get_random_name(
_iSex INT DEFAULT -1
)
RETURNS VARCHAR
AS $BODY$
/*姓的随机范围,全国人数最多的前100个姓*/
DECLARE rand_surName VARCHAR;
/*名的随机范围*/
DECLARE rand_girlName VARCHAR;
DECLARE rand_boyName VARCHAR;
/*随机生成姓名的长度,2到4个字*/
DECLARE name_len INT;
/* 准备返回的姓名 */
DECLARE _ResultName VARCHAR;
BEGIN
-- 功能:用于为测试库生成随机的姓名。生成的姓名基本能看,且一般能一眼看出不是正常的姓名,主要用于在系统测试时灌入测试数
-- 据,或用于覆盖现场正式数据为测试数据
-- PS:rand_surName和rand_girlName、rand_boyName可根据情况自行调整
-- 本存储过程依赖我的另一个函数random_int(_begin_number int, _end_number int),或自行调整为随机数生成的写法。
-- 调用Demo:SELECT get_random_name();
-- 参数:
-- _iSex,性别,-1=随机生成;1=男,2=女,可根据该值生成侧重于男性的姓名或女性的姓名
-- 本存储过程在PgSQL 14.1 中调试通过
-- 如果不传性别,则随机生成
IF _iSex = -1 THEN
_iSex = random_int(1, 2);
END IF;
-- 输出性别
RAISE NOTICE '性别=[%]', _iSex;
-- 姓的随机范围
rand_surName := '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦许何吕张孔曹严华金魏陶姜谢邹章云苏潘葛范彭马方袁柳史唐薛汤殷罗';
-- 姓的随机范围(之前是百家姓,现调整为全国人数量多的前100个姓)
rand_surName := '李王张刘陈杨赵黄周吴徐孙胡朱高林何郭马罗梁宋郑谢韩唐冯于董萧程曹袁邓许傅沈曾彭吕苏卢蒋蔡贾丁魏薛叶阎余潘杜戴夏钟汪田任姜范方石姚谭廖邹熊金陆郝孔白崔康毛邱秦江史顾侯邵孟龙万段漕钱汤尹黎易常武乔贺赖龚文';
-- 名的随机范围
rand_girlName := '秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽';
rand_boyName := '伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘';
-- PgSQL中,length(rand_surName)=字符数 ,中文字符占用1个长度
-- 输出调试信息
-- RAISE NOTICE 'rand_surName.length=[%]', length(rand_surName);
-- RAISE NOTICE 'test name1=[%]', substr(rand_surName, 100, 1);
-- 超出范围取不到字,但不报错
-- RAISE NOTICE 'test name2=[%]', substr(rand_surName, 101, 1);
-- RAISE NOTICE 'test name3=[%]', substr(rand_surName, 102, 1);
-- 随机生成姓名的字数,3到4个字
name_len := random_int(3, 4);
-- 姓 begin
_ResultName = substr(rand_surName, random_int(1, length(rand_surName)), 1);
-- 若返回姓名是3个字或4个字的情况,需要给姓再加一个字,暂不考虑复姓
IF (name_len = 3) OR (name_len = 4) THEN
_ResultName = concat(_ResultName, substr(rand_surName, random_int(1, length(rand_surName)), 1));
END IF;
-- 姓 end
-- 名 begin
-- 男生
IF _iSex = 1 THEN
_ResultName = concat(_ResultName, substr(rand_boyName, random_int(1, length(rand_boyName)), 1));
ELSE -- 女生
_ResultName = concat(_ResultName, substr(rand_girlName, random_int(1, length(rand_girlName)), 1));
END IF;
-- 返回姓名字数为4的,名需要再加一个字
IF name_len = 4 THEN
-- 男生
IF _iSex=1 THEN
_ResultName = concat(_ResultName, substr(rand_boyName, random_int(1, length(rand_boyName)), 1));
ELSE -- 女生
_ResultName = concat(_ResultName, substr(rand_girlName, random_int(1, length(rand_girlName)), 1));
END IF;
END IF;
-- 名 end
RETURN _ResultName;
END;
$BODY$
LANGUAGE plpgsql VOLATILE