2017-11-15 1 views
1

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; 
+0

Sie sich hier dynamische SQL benötigen - Sie können nicht Variable verwenden, um Beziehung Namen zu setzen in SQL –

Antwort

1

Sie dynamische SQL hier brauchen würde, zum Beispiel:

t=# create or replace function ds() returns table (i int) as 
$$ 
declare 
tn text := 'pg_database'; 
begin 
return query execute format('select oid::int from %I',tn); 
end; 
$$language plpgsql 
; 
CREATE FUNCTION 
t=# select * from ds(); 
    i 
----------- 
     1 
    12945 
    12950 
    12963038 
111274822 
    32059515 
    26947889 
173381559 
    32061155 
    32061156 
    82287221 
203004236 
214018521 
(13 rows) 
+0

Ich bin mir nicht sicher, ob ich folge, kannst du das bitte mit einem für mich relevanten Beispiel klären? – Matt

+0

im Grunde müssen Sie 'zurück Anfrage' Chnage an 'zurück Abfrage exexute' und setzen Abfrage auf th Zeichenfolge –

+0

Ich werde den Fall aktualisieren, das Format-Tag ist viel wie Python. Das Problem, das ich jetzt habe, ist, dass ich, weil ich auf eine Tabelle verweise, keine Anführungszeichen um sie herum haben kann, und wenn ich die Tabelle als ein Format-Objekt einfüge, möchte ich ihr Anführungszeichen hinzufügen. So postgre sagt die Tabelle existiert nicht ... – Matt

Verwandte Themen