Ich bin neu in PL/pgSQL, also ist dies eine Art Versuch und Irrtum für mich. Ich versuche, eine leere Funktion zu erstellen, die, wenn sie aufgerufen wird, eine Tabelle auffüllt. Hier ist, was ich bisher:PL/pgSQL Syntax Fehler am Ende der Eingabe
create or replace function counties()
returns table(code varchar(16), county varchar(50), count int) as $$
DECLARE
new_version varchar(50) := concat('sometext', max(REGEXP_REPLACE(COALESCE(schema_name, '0'), '[^0-9]*' ,'0')::integer), 'sometext') from information_schema.schemata where schema_name like 'gcversa%';
old_version varchar(50) := concat('sometext', max(REGEXP_REPLACE(COALESCE(schema_name, '0'), '[^0-9]*' ,'0')::integer)-2, 'sometext') from information_schema.schemata where schema_name like 'gcversa%';
BEGIN RETURN QUERY
with cte_current as (select distinct a.code as code, b.countyname as county from old_version a, public.counties b
where st_intersects(a.geom,b.geom) = True group by a.code, b.countyname),
cte_new as (select distinct a.code as code, b.countyname as county from new_version a, public.counties b
where st_intersects(a.geom,b.geom) = True group by a.code, b.countyname),
cte_union as (select code, county from cte_current
union all
select code, county from cte_new)
select code,county, count(*) as count
from cte_union
group by code, county
Having count (*) <> 2;
END;
$$
LANGUAGE plpgsql;
Die beiden Variablen, die ich erklärt haben, verweisen und verketten zwei PostgreSQL Schemas, und dann versuche ich diese Variablen in den CTE einzufügen, um dann Vereinigung sie alle zusammen. Ich habe die Funktion korrekt ausgeführt, aber wenn ich select counties()
nennen, bekomme ich diesen Fehler:
ERROR: relation "old_version" does not exist
LINE 1: ...tinct a.code as code, b.countyname as county from old_versio...
Also, es ist nicht die Variable Kommissionierung, die ich erklärte, irgendwelche Vorschläge?
UPDATE Per Vao Tsun Vorschlag verwendete ich dynamische SQL und das Format() Funktion. Hier ist, was das endgültige Arbeitsmodell wie folgt aussieht:
drop function counties();
create or replace function counties()
returns table(code varchar(16), county varchar(50), count bigint) as $$
DECLARE
new_version_number varchar(50) := concat('gcversa00', MAX("versionnumber")) from "gcdefault"."versionhistory";
old_version_number varchar(50) := concat('gcversa00', MAX("versionnumber"-2)) from "gcdefault"."versionhistory";
BEGIN RETURN QUERY EXECUTE
format(
'with cte_current as (select distinct a.code as code, b.countyname as county from %I.servicearea a, public.counties b
where st_intersects(a.geom,b.geom) = True group by a.code, b.countyname),
cte_new as (select distinct a.code as code, b.countyname as county from %I.servicearea a, public.counties b
where st_intersects(a.geom,b.geom) = True group by a.code, b.countyname),
cte_union as (select code, county from cte_current
union all
select code, county from cte_new)
select code,county, count(*) as count
from cte_union
group by code, county
Having count (*) <> 2', new_version_number, old_version_number
);
END;
$$
LANGUAGE plpgsql;
Sie sich hier dynamische SQL benötigen - Sie können nicht Variable verwenden, um Beziehung Namen zu setzen in SQL –