PLSQL 季度函式寫法/for迴圈動態sql執行
阿新 • • 發佈:2020-12-30
技術標籤:sqlpgsql季度函式pgsql動態sql執行pgsql 動態變數
參考文章:
.最簡單的例子
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