一、初始化机构链
WITH RECURSIVE my_sys_dept AS(
SELECT inst_code,inst_name,parent_inst_code,cast(inst_code AS text) as link_code from sys_dept
where parent_inst_code=''
UNION
select dd.inst_code,
dd.inst_name ,
dd.parent_inst_code,
d.link_code||','||dd.inst_code
from my_sys_dept d INNER JOIN sys_dept dd on d.inst_code=dd.parent_inst_code
)
--select * from my_sys_dept
UPDATE sys_dept t1
SET DESCRIPTION = fp.link_code
FROM my_sys_dept fp
WHERE t1.inst_code = fp.inst_code;
二、创建存储过程
CREATE OR REPLACE PROCEDURE update_rxgs_stat(stat_date VARCHAR(10),days INT)
LANGUAGE plpgsql
AS $$
DECLARE
date_array TEXT[];
i INT;
base_date DATE;
BEGIN
--如果为空,则取days天前的数据进行处理
IF stat_date ='' THEN
--初始化数组
date_array := '{}';
--循环生成日期
FOR i IN 0..days-1 LOOP
--执行统计不包括当天,从N-1开始统计
base_date :=CURRENT_DATE-i-1;
date_array := array_append(date_array,to_char(base_date,'YYYY-MM-DD'));
END LOOP;
ELSE
date_array := ARRAY[stat_date];
END IF;
--这里获取了最终目标要执行的时间日期
FOR i IN 1..array_length(date_array,1) LOOP
--相关操作
END LOOP;
END;
$$;
三、存储过程相关操作
--手动指定某一天的数据重跑
CALL update_rxgs_stat('2025-08-17',0);
--重跑十天前的数据(这个是每天定时执行的)
CALL update_rxgs_stat('',10);
--查看已定义的存储过程
SELECT proname FROM pg_proc WHERE pronamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');
--查看存储过程定义
SELECT pg_get_functiondef(p.oid)
FROM pg_proc p
LEFT JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE p.proname = 'update_rxgs_stat' AND n.nspname = 'public';
--删除存储过程
DROP PROCEDURE IF EXISTS update_rxgs_stat;