一、初始化机构链
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_deptUPDATE sys_dept t1SET DESCRIPTION = fp.link_codeFROM my_sys_dept fpWHERE t1.inst_code = fp.inst_code;
二、创建存储过程
CREATE OR REPLACE PROCEDURE update_rxgs_stat(stat_date VARCHAR(10),days INT)LANGUAGE plpgsqlAS $$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 pLEFT 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;