2017-05-19 4 views
1

J'essaie de créer une vue à l'intérieur de la fonction en utilisant plpgsql qui retourne la colonne x de la "petite" table qui est définie comme (x entier, y entier).La relation n'existe pas PLPGSQL

create or replace function skyline_naive2(dataset text) returns setof integer as 
$$ 
declare 
    fullx text; 
begin 
    fullx = dataset||'_skyline_naive2'; 
    execute format('create view %s as select x,y from %s',fullx,dataset); 
    return query select x from fullx; 
end 
$$ language plpgsql; 

select * from skyline_naive2('small'); 

Il retourne « relation fullx n'existe pas »

Je comprends qu'il est parce qu'il n'y a pas de relation fullx, mais je veux appeler la vue en utilisant le nom de la variable.

Toute aide sera

Répondre

2

Utiliser SQL dynamique pour select (que vous avez utilisé pour create):

create or replace function skyline_naive2(dataset text) returns setof integer as 
$$ 
declare 
    fullx text; 
begin 
    fullx = dataset||'_skyline_naive2'; 
    execute format('create view %I as select x,y from %I',fullx,dataset); 
    return query execute format('select x from %I', fullx); 
end 
$$ language plpgsql; 
+0

merci beaucoup aussi ce qui peut être fait si je retourne un entier au lieu de setof nombre entier? foreg requête de retour execute format ('select count (x) from% I', fullx); mais la requête de retour ne fonctionne qu'avec setof –

+0

Dans ce cas, vous pouvez déclarer une variable entière, 'execute ... into variable' et la renvoyer. – klin

2

Vous devez EXECUTE votre requête dynamique:

RETURN QUERY EXECUTE 'SELECT x FROM ' || fullx; 
+0

merci beaucoup aussi ce qui peut être fait si je retourne un entier au lieu de setof entier? foreg return query exécuter le format ('select count (x) de% I', fullx); mais la requête de retour ne fonctionne qu'avec setof –