【发布时间】:2016-03-24 12:41:56
【问题描述】:
我正在开展一个项目,该项目涉及计算来自区域内运输成本的产业集群成本结构的百分比。我将为每个行业集群提供一个表格,其中包含详细的成本明细(naics、金额、inregion_amt)、一个包含所有运输 naics 的查找表transpo_industries,以及一个汇总表cluster_costs,我希望最终包含每个行业集群的名称(c_name)、总成本(tot_cost)和区域内运输成本(inregion_transpo)。该表已经填充了所有行业名称,这些名称与相应行业集群的表名称相匹配。
由于我需要运行至少 15 个行业集群,并且可能希望使用较小的数据子集重新运行此代码,因此我正在尝试创建一个函数。下面的代码创建了没有错误的函数,但是当我尝试调用它时,我得到一个语法错误(“ERROR: syntax error at or near "clustercosts" SQL state: 42601")
谁能帮忙指出我哪里出错了?
create or replace function clustercosts(tblname text) RETURNS void
AS $$
BEGIN
EXECUTE 'update cluster_costs set tot_cost= (select sum(amount) from '||tblname||'), inregion_transpo = (select sum(inregion_amt) from '||tblname||', transpo_industries where '||tblname||'.naics=transpo_industries.naics) where c_name='||tblname||;
END;
$$ Language plpgsql;
使用 format() 的版本给了我同样的错误:
CREATE OR REPLACE FUNCTION udate_clustercosts(tblname text)
RETURNS void AS
$BODY$
BEGIN
EXECUTE format(
'update cluster_costs'
'set tot_cost= (select sum(amount)from %I),'
'inregion_transpo = (select sum(inregion_amt) from %I, transpo_industries where %I.naics=transpo_industries.naics)'
'where c_name=%I',tblname);
END;
$BODY$
LANGUAGE plpgsql;
【问题讨论】:
-
from后面少了一个空格:from '||... -
强烈建议使用 format() 函数和 quote_ident() 而不是字符串连接。
-
我添加了空格(上面编辑的代码),但我仍然遇到同样的错误。在我尝试字符串连接之前,我实际上也尝试了一个带有 format() 的版本并且遇到了同样的问题
-
尝试将
'where c_name=%I'更改为'where c_name=%L' -
其他选项:
where c_name='''||tblname||'''';
标签: postgresql plpgsql