私は、地域内の輸送費に由来する産業クラスターのコスト構造のパーセントを計算するプロジェクトに取り組んでいます。詳細なコスト内訳(naics、amount、inregion_amt)、すべての交通機関naicsのルックアップテーブルtranspo_industries
、最終的に各業種のクラスタ名(c_name)を含めるサマリーテーブルcluster_costs
を持つ各業種クラスタごとに1つの表があります。 、総コスト(tot_cost)、および地域内輸送コスト(inregion_transpo)を含む。このテーブルには、既に対応する業界クラスタのテーブル名と一致するすべての業界名が入力されています。plpgsql関数を呼び出すときに構文エラーが発生する
私は少なくとも15の産業クラスターを実行する必要があり、データのより小さいサブセットでこのコードを再実行したいと思うので、私は関数を作成しようとしています。次のコードはエラーなしで関数を作成しますが、私はそれを呼び出そうとすると文法エラーが発生します( "ERROR:構文エラー"または近くの "clustercosts" SQLステート: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;
フォーマットを使用したバージョンは()私に同じエラーを与える:
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()を使用するようにアドバイスします。 – joop
スペースを追加しましたが(上記で編集したコード)、私はまだ同じエラーが発生しています。私は実際に文字列の連結を試み、同じ問題を抱えていた前に、format()でバージョンを試しました。 –