Ich arbeite an einem Projekt, bei dem der Prozentsatz der Kostenstruktur eines Industrieclusters berechnet wird, der aus den Transportkosten in der Region stammt. Ich habe eine Tabelle für jeden Industriecluster mit der detaillierten Kostenaufschlüsselung (Naics, Menge, inregion_amt), einer Nachschlagetabelle transpo_industries
mit allen Transportnativen und einer Übersichtstabelle cluster_costs
, die schließlich den Namen jedes Industrieclusters enthalten soll (c_name) die Gesamtkosten (tot_cost) und die Transportkosten innerhalb der Region (inregion_transpo). Die Tabelle enthält bereits alle Branchennamen, die den Tabellennamen für die entsprechenden Industriecluster entsprechen.Syntaxfehler beim Aufruf der plpgsql-Funktion
Da ich mindestens 15 Industrie-Cluster durchlaufen muss und diesen Code möglicherweise mit kleineren Teilmengen der Daten erneut ausführen möchte, versuche ich, eine Funktion zu erstellen. Der folgende Code erstellt die Funktion ohne Fehler, aber wenn ich versuche, es aufzurufen, erhalte ich einen Syntaxfehler ("ERROR: Syntaxfehler bei oder in der Nähe von" clustercosts "SQL-Status: 42601) Ich gehe falsch?
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;
Eine Version mit Format() gibt mir den gleichen Fehler:
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;
fehlt ein Leerzeichen nach dem 'from':' from '|| ... ' –
Starker Hinweis zur Verwendung der format() - Funktion und quote_ident() anstelle der String-Verkettung. – joop
Ich habe die Leerzeichen hinzugefügt (Code oben bearbeitet), aber ich bekomme immer noch den gleichen Fehler. Ich probierte auch eine Version mit format(), bevor ich die String-Verkettung versuchte und hatte die gleichen Probleme –