如何从Postgres中的动态SQL获得结果?

时间:2015-12-07 12:10:01

标签: sql postgresql dynamic-sql

原始表,其规则存储在一个名为md_formula的表中,用于在目标表中进行映射

放弃/创建/插入raw_dbs_transactiondetailscash

DROP TABLE raw_dbs_transactiondetailscash

CREATE TABLE raw_dbs_transactiondetailscash(
    accountnumber VARCHAR(100),
    referencecurrency VARCHAR(100),
    transactiondate datetime)

INSERT INTO raw_dbs_transactiondetailscash(
    accountnumber, referencecurrency, transactiondate)
    SELECT 'XYZ','$','01/01/2016'            

放弃/创建/插入md_formula

DROP TABLE MD_Formula 

CREATE TABLE MD_Formula (
    Format VARCHAR(20),
    tbl_Src VARCHAR(200),
    Col_src VARCHAR(500),
    tbl_Des VARCHAR(200),
    Col_des VARCHAR(100),
    Condition VARCHAR(500) )

INSERT INTO md_formula(format, tbl_src, Col_src, tbl_des,Col_des)    
    SELECT 'Dbs','raw_dbs_transactiondetailscash','accountnumber',
            'normalized_transaction','account_number'
    UNION ALL
    SELECT 'Dbs','raw_dbs_transactiondetailscash','referencecurrency',
            'normalized_transaction','currency'
    UNION ALL
    SELECT 'Dbs','raw_dbs_transactiondetailscash','transactiondate',
            'normalized_transaction','trade_date'

从md_Formula中存储的原始表中获取数据 通过TSQL(仅选择一列)

这实际上会执行

SELECT accountnumber
FROM raw_dbs_transactiondetailscash

并从raw_dbs_transactiondetailscash

获取数据集
DECLARE @sql VARCHAR(100)

SELECT TOP 1 @sql= 'SELECT '+Col_src+ ' FROM '+tbl_Src FROM MD_Formula

EXEC (@sql)

通过Postgres(仅动态查询,如何从动态sql中的原始表中获取数据仍是一个问题)

这需要执行

SELECT accountnumber,referencecurrency,transactiondate
FROM raw_dbs_transactiondetailscash

并获得结果

SELECT 'SELECT '|| string_Agg(col_src,',') ||' FROM ' ||  tbl_src FROM md_formula
WHERE format='Dbs'
GROUP BY tbl_src

2 个答案:

答案 0 :(得分:4)

对于动态查询,您需要使用'execute'命令。

EXECUTE dynamic-query-string INTO target-variable...

此手册页位于:http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

HTH

答案 1 :(得分:0)

所以这就是我根据我的要求试图获得的结果。 感谢@pozs,您对某些帖子的链接非常有帮助,感谢。

解决方案:

Create or replace Function gen_Test(query_name refcursor)
returns refcursor
as $$
Declare sql text;
begin
sql:=(SELECT 'SELECT '|| string_Agg(col_src,',') ||' FROM ' ||  tbl_src FROM md_formula
WHERE format='Dbs'
GROUP BY tbl_src);
open query_name for execute 
sql;
return query_name;
end;
$$ language plpgsql;


select gen_Test('english');
fetch all in english;

PS:感谢所有人给出了解决这个问题的时间的反馈。