数据仓库--postgresql for 循环记录完成存储过程总调度
2017-09-28 11:05
531 查看
业务需求:需要创建一个存储过程调度五个存储过程,思路使用FOR循环获取表名,由于存储过程是P_加表名,定义一个变量获取存储过程名。 执行存储过程必须判断task表里执行的状态,如果是0则执行存储过程,并更新task里的状态和执行时间。
在此遇见两个问题:oracle和POSTSQL还是有很大区别的 遇见一个错误: 1、在执行select into SQL语句的时候会报错,解决方法:先定义一个SQL语句,然后使用动态SQL执行EXECUTE SQL语句。 cannot EXECUTE a null querystring 2、执行存储过程,使用PERFORM执行存储过程。 补充:SQL语句执行存储过程 select P_ALL_tables()/*存储过程名*/;
dis_task_info 表记录一个执行存储过程(CDS层表)是否成功的记录和每一个子任务(对应的ODS层的表) syscd taskcd tabnm taskst taskdt starttime endtime errmsg DW-ODS-1 ODS-1-E-CDS_P_WITHDRAW CDS_P_WITHDRAW 0 20170926 2017-09-27 20:56:33.219061 2017-09-27 20:56:33.219061 ------CDS层表 (其实是相当于是日志表、不过对历史数据不进行留痕)
创建存储过程:
CREATE OR REPLACE FUNCTION dis.P_ALL_tables() RETURNS void AS$$ declare l_taskst text; ----获取任务状态l_tab_name text; ---获取表名l_prc_name text; ---获取存储过程名l_sql text; ---执行脚本获取任务状态l_sql1 text; ---执行脚本获取ETL时间tab_cur record; ----定义记录类型l_taskdt text; ---获取昨日时间l_starttime TIMESTAMP WITHOUT TIME ZONE; ---定义任务开始时间l_endtime TIMESTAMP WITHOUT TIME ZONE; ----定义任务结束时间l_sqlerrm text ;------获取错误信息BEGIN----for 循环for tab_cur in (select 'CDS_S_TAB_NAME1' table_name----需要写需要的表名union allselect 'CDS_S_TAB_NAME2' table_nameunion allselect 'CDS_S_TAB_NAME3' table_nameunion allselect 'CDS_S_TAB_NAME4'table_nameunion allselect 'CDS_S_TAB_NAME5' table_name) loopl_tab_name := tab_cur.table_name;l_prc_name := 'cds.P_' || tab_cur.table_name || '()';l_sql := 'SELECT max(t.taskst) FROM dis.dis_task_info t where tabnm=''' || l_tab_name || '''';EXECUTE l_sqlinto l_taskst;l_sql1 := 'select to_char(to_date (max(taskdt),''yyyymmdd'')+1,''yyyymmdd'') from dis.dis_task_info where tabnm=''' || l_tab_name || '''';EXECUTE l_sql1 into l_taskdt;IF l_taskst in ('0') THENl_starttime := now();---执行存储过程PERFORM l_prc_name;l_endtime := now();----更新执行状态、时间EXECUTE 'update dis_task_info set taskst=0,starttime=''' || l_starttime || ''',endtime=''' || l_endtime || ''' ,taskdt=''' || l_taskdt || ''' where tabnm=''' || l_tab_name || '''';elsereturn;END IF;end loop;EXCEPTIONWHEN others THENl_sqlerrm :=SQLERRM;---获取错误EXECUTE 'update dis_task_info set taskst=2,,starttime=''' || l_starttime || ''',endtime=''' || l_endtime || ''',errmsg=''' || l_sqlerrm || ''' where tabnm=''' || l_tab_name || '''where tabnm=''' || l_tab_name || '''';RAISE EXCEPTION '(%)', SQLERRM;END $$LANGUAGE PLPGSQL;
相关文章推荐
- 记录一个SQL Server 2005的存储过程,循环修改数据例子
- 存储过程查询一张表中记录是否连续、重复并且取出对应的数据
- MySQL存储过程循环插入数据
- 存储过程查询一张表中记录是否连续、重复并且取出对应的数据
- oracle 存储过程循环插入10000条记录---存储过程
- 校验表中数据是否有循环编码的通用存储过程.sql
- MYSQL存储过程循环遍历插入数据
- 数据仓库建设_关系型数据库存储_调度(1)
- 存储过程 删除两表关联的数据记录
- 存储过程循环添加数据到数据库中
- 导出数据库数据记录成insert语句的存储过程
- 如何更好处理数据仓库服务必然需要云数据库HybridDBforPostgreSQL
- MySql 存储过程使用游标循环插入数据示例
- oracle存储过程中 使用游标做循环封装数据集
- 在存储过程中使用游标循环表,组织数据
- sqlserver 练习题目(存储过程:循环erp数据表,生成另一个表数据)
- 循环向存储过程中插入100条日期格式化的数据序列号递增
- 存储过程循环插入数据
- 一个循环插入数据到数据库的存储过程
- postgresql 存储过程动态插入数据 2