2015-07-26 1 views
0

J'ai une fonction qui Proccess certaines données:créer une vue en fonction de postgresql

CREATE OR REPLACE FUNCTION A(x integer, y timestamp with time zone, z integer[]) 
     RETURNS SETOF typea AS 

$BODY$ 
SELECT * 
FROM func1($1,$2,$3) as a 
WHERE ... 


$BODY$ 
LANGUAGE sql VOLATILE 

Comment puis-je convertir la requête:

SELECT * 
FROM func1($1,$2,$3) as a 
WHERE ... 

dans un VIEW? La chose est que func1 a besoin la fonction A paramètres ...

Ce que j'ai maintenant ceci:

CREATE OR REPLACE FUNCTION A(x integer, y timestamp with time zone, z integer[]) 
     RETURNS SETOF typea AS 
$BODY$ 
CREATE OR REPLACE VIEW myView as (select * from func1($1,$2,$3)); 
select * from myView ; 
$BODY$ 
LANGUAGE sql VOLATILE 

et je reçois

ERROR: relation "myView " does not exist

dans le select * from myView ;

Répondre

1

I pense que le problème est que les fonctions Postgres sont traitées en deux étapes. Dans la première étape, la fonction est compilée. Dans la seconde, il est exécuté.

Si la vue n'existe pas, elle n'est pas créée lors de la phase de compilation. Toutefois, le select échouera, car la vue n'existe pas.

Créer une vue dans une fonction me semble étrange. Cependant, je peux penser à deux contournements:

  • Vérifiez que la vue existe avant la fonction est créée.
  • Utilisez SQL dynamique pour accéder à la vue dans la fonction.
+0

Cette fonction génère des données, travaille dessus et donne le résultat final. Ce que je veux, c'est voir le résultat avant et après que la fonction a fait son travail. La première étape de la fonction est de générer les données de sorte que la deuxième étape doit être l'enregistrer. et c'est là que je suis coincé. Comment U proposerait-il de faire cela? – avi

+0

Je vous suggère de sauvegarder les résultats dans une table ou de les imprimer. Une vue ne semble pas être la bonne solution à ce problème. Vous voudrez peut-être poser * une autre * question décrivant ce que vous essayez vraiment d'accomplir, ainsi que des exemples de données et les résultats souhaités. –

+0

Vous avez dit que Dynamic SQL peut le résoudre. Comment feriez-vous cela? – avi