如何从 Postgres 中的动态 SQL 获得结果?
How to get a result from dynamic SQL in Postgres?
原始 Table 其规则存储在一个名为 md_formula 的 table 中,用于映射到目标 table
Drop/Create/Insert 对于 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'
Drop/Create/Insert 对于 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 中的原始 table 获取数据
通过 TSQL
(例如仅选择一列)
这将实际执行
SELECT accountnumber
FROM raw_dbs_transactiondetailscash
并从 raw_dbs_transactiondetailscash
table
获取一组数据
DECLARE @sql VARCHAR(100)
SELECT TOP 1 @sql= 'SELECT '+Col_src+ ' FROM '+tbl_Src FROM MD_Formula
EXEC (@sql)
Via Postgres
(Dynamic Query 只准备了,如何在dynamic sql中从raw table获取数据还是个问题)
这个需要执行
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
对于动态查询,您需要使用 'execute' 命令。
EXECUTE dynamic-query-string INTO target-variable...
HTH
这就是我按照我的要求尝试达到的结果。
感谢@pozs,你的 link 对一些 post 真的很有帮助,赞赏。
解决方案:
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:感谢大家为这个问题抽出时间提供反馈。
原始 Table 其规则存储在一个名为 md_formula 的 table 中,用于映射到目标 table
Drop/Create/Insert 对于 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'
Drop/Create/Insert 对于 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 中的原始 table 获取数据
通过 TSQL
(例如仅选择一列)
这将实际执行
SELECT accountnumber
FROM raw_dbs_transactiondetailscash
并从 raw_dbs_transactiondetailscash
table
DECLARE @sql VARCHAR(100)
SELECT TOP 1 @sql= 'SELECT '+Col_src+ ' FROM '+tbl_Src FROM MD_Formula
EXEC (@sql)
Via Postgres
(Dynamic Query 只准备了,如何在dynamic sql中从raw table获取数据还是个问题)
这个需要执行
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
对于动态查询,您需要使用 'execute' 命令。
EXECUTE dynamic-query-string INTO target-variable...
HTH
这就是我按照我的要求尝试达到的结果。 感谢@pozs,你的 link 对一些 post 真的很有帮助,赞赏。
解决方案:
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:感谢大家为这个问题抽出时间提供反馈。