數據倉庫--postgresql for 循環記錄完成存儲過程總調度

		
業務需求:需要創建一個存儲過程調度五個存儲過程,思路使用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 all
				select 'CDS_S_TAB_NAME2' table_name
				union all 
				select 'CDS_S_TAB_NAME3' table_name
				union all
				select 'CDS_S_TAB_NAME4'table_name 
				union all
				select 'CDS_S_TAB_NAME5' table_name) loop
    l_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_sql
      into 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') THEN
      l_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 || '''';
    else
      return;
    END IF;
  end loop;
EXCEPTION
  WHEN others THEN
  l_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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章