〇、相关资料
一、系统函数/语句
1.1 session相关
参考地址:PostgreSQL 会话管理_backend_xmin pgsql-CSDN博客
1、死锁及会话join查询
SELECT * FROM pg_locks pl
LEFT JOIN pg_stat_activity psa
ON pl.pid = psa.pid;
1.2 类型转换
1、结果转json数组
参考地址:pgsql 查询结果转换为json数组 - hziwei - 博客园 (cnblogs.com)
select array_to_json(array_agg(row_to_json(t)))
from (SELECT * FROM test) t
二、自定义函数
2.1 雪花算法
CREATE OR REPLACE FUNCTION "tp"."snow_next_id"(OUT "result" int8)
RETURNS "pg_catalog"."int8" AS $BODY$
DECLARE
our_epoch bigint := 1314220021721;
seq_id bigint;
now_millis bigint;
shard_id int := 5;
BEGIN
seq_id := nextval('table_id_seq') % 16384;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
result := (now_millis - our_epoch) << 23;
result := result | (shard_id << 10);
result := result | (seq_id);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
1.2 创建分区
CREATE OR REPLACE FUNCTION "ods"."createpartitionifnotexists"("tb_name" varchar, "partiton_val" varchar)
RETURNS "pg_catalog"."void" AS $BODY$
DECLARE master_name TEXT := tb_name; -- 创建分区表的表名
DECLARE partition_name TEXT := tb_name || '_' || partiton_val; -- 分区的表名称
BEGIN
-- 判断分区名称是否存在,不存在时才需要创建
IF to_regclass (partition_name) IS NULL THEN
-- 执行创建分区
EXECUTE format (
'create table %L partition of %L for values in (%s)',
partition_name,
master_name,
partiton_val
);
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
1.3 字符串去空格
CREATE OR REPLACE FUNCTION "ods"."code_strip_char"("code" varchar)
RETURNS "pg_catalog"."varchar" AS $BODY$
declare
DECLARE
code_strip VARCHAR = regexp_replace(code, '\D', '', 'g');
BEGIN
IF code_strip is not null and code_strip != '' THEN
RETURN code_strip;
ELSE
RETURN NULL;
end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
1.4 执行SQL
CREATE OR REPLACE FUNCTION "base"."supcon_rule_call"("rule_id" int8, "rule_description" text=NULL::text)
RETURNS TABLE("message" text) AS $BODY$
DECLARE
execute_sql_content TEXT;
execute_context_info TEXT;
rows_affected BIGINT;
sql_update TEXT;
sql_insert TEXT;
BEGIN
IF rule_description IS NOT NULL THEN
RAISE NOTICE '规则id:%,名称:%将会执行',rule_id,rule_description;
execute_context_info:='规则'||rule_id||'('||rule_description||')'||'得到执行';
ELSE
RAISE NOTICE '规则id:%将会执行',rule_id;
execute_context_info:='规则'||rule_id||'得到执行';
END IF;
-- 根据参数值查询表中存储的SQL语句(包含更新为false和冲突更新)
SELECT sql_custom
INTO execute_sql_content
FROM base.bd_rule_config_info
WHERE bd_rule_config_info_id = rule_id;
RAISE NOTICE '执行的SQL为:%',execute_sql_content;
-- select SPLIT_PART(execute_sql_content,';',1) into sql_update;
-- 执行获取到的SQL语句
EXECUTE execute_sql_content;
GET DIAGNOSTICS rows_affected = ROW_COUNT;
RAISE NOTICE '影响行数:%',rows_affected;
execute_context_info := execute_context_info||',影响行数为'||rows_affected::varchar||'条';
RETURN QUERY SELECT execute_context_info::TEXT AS message;
EXCEPTION
-- 可根据需要进行错误处理
WHEN OTHERS THEN
RAISE EXCEPTION '执行SQL时出现异常,异常信息为: %', SQLERRM;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000