1. 程式人生 > 其它 >PLSQL 季度函式寫法/for迴圈動態sql執行

PLSQL 季度函式寫法/for迴圈動態sql執行

技術標籤:sqlpgsql季度函式pgsql動態sql執行pgsql 動態變數

參考文章:

  1. 從PostgreSQL函式返回SETOF行

  2. PL/pgSQL 的迴圈語句

  3. PostgreSQL 遍歷表的PLSQL列舉

.最簡單的例子


CREATE OR REPLACE FUNCTION for_gen_demo1()
  RETURNS TABLE
          (
            col1 varchar,
            col2 varchar
          )
  language plpgsql AS
$func$
BEGIN
  RETURN QUERY EXECUTE ('select ht_guid col1,zd_guid col2 from td_ht_xz limit 2');
END
$func$;

簡單的for迴圈例子



	create function for_gen_demo2() returns TABLE
											(
											  col1 character varying,
											  col2 character varying

											)
  language plpgsql
as
$$
declare
  nf_datas record;
BEGIN
  for nf_datas in (select nf, length(nf) size from gen_nf('2017', '2018'))
    loop

      if (nf_datas.size > 0) then
        RETURN QUERY EXECUTE
			  ('select ht_guid col1, zd_guid col2
	from td_ht_xz
where to_char(qd_rq, ''yyyy'') = ''2017''
limit 2');
      end if;
    end loop;
END
$$;

動態sql+for迴圈


create function gen_jd(rq_s varchar,rq_e varchar,sql varchar) returns TABLE
                                                    (
                                                      jd   character varying,
                                                      date numeric
                                                    )
  language plpgsql
as
$$
declare
  nf_datas record;
BEGIN
  for nf_datas in (select row_number() over (order by nf ) as r, nf from gen_nf(rq_s, rq_e))
    loop

      if (nf_datas.r > 0) then--time_range 迴圈次數
        RETURN QUERY EXECUTE
          ('select t.jd, sum(t.date) as date
            from (select cast(case
                                when b.jd in (''01'', ''02'', ''03'') then ' || '''' || cast(nf_datas.nf as varchar) || '''' || '''1j''
                                when b.jd in (''04'', ''05'', ''06'') then ' || '''' || cast(nf_datas.nf as varchar) || '''' || '''2j''
                                when b.jd in (''07'', ''08'', ''09'') then ' || '''' || cast(nf_datas.nf as varchar) || '''' || '''3j''
                                when b.jd in (''10'', ''11'', ''12'') then ' || '''' || cast(nf_datas.nf as varchar) || '''' || '''4j'' end as varchar) as jd,
                         b.date
                  from (select cast(substr(jd, position(''-'' in jd) + 1, length(jd)) as varchar) jd, date
                        from ('|| sql ||') a
                        where substr(jd, 0, position(''-'' in jd)) = ' || '''' || cast(nf_datas.nf as varchar) || '''' || ') b) t
            group by t.jd');
      end if;
    end loop;
END
$$;

注意所有的都叫做jd,和date