2015-07-26 3 views
0

У меня есть функция, которая proccess некоторые данные:создания представления в функции 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 

Как я могу преобразовать запрос:

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

в VIEW? Дело в том, что func1 нужны параметры функции A ...

То, что я сейчас это:

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 

и я получаю

ERROR: relation "myView " does not exist

в select * from myView ;

ответ

1

I что проблема заключается в том, что функции Postgres обрабатываются в два этапа. На первом этапе функция компилируется. Во втором - выполняется.

Если вид не существует, то он не создается на этапе компиляции. Тем не менее, select не будет работать, потому что представление не существует.

Создание представления в функции кажется странным для меня. Тем не менее, я могу думать о двух обходных:

  • Убедитесь, что точка зрения существует перед тем создается функция.
  • Используйте динамический SQL для доступа к представлению внутри функции.
+0

Эта функция генерирует некоторые данные, работа над ними дает окончательный результат. Я хочу посмотреть результат до и после того, как функция сделала это. Первым шагом функции является генерация данных, поэтому второй шаг необходимо сохранить. и вот где я застрял. Как бы это сделать? – avi

+0

Я предлагаю вам либо сохранить результаты в таблице, либо распечатать их. Представление не похоже на правильное решение этой проблемы. Возможно, вы захотите задать еще один вопрос, описывающий то, что вы действительно пытаетесь выполнить, вместе с образцами данных и желаемыми результатами. –

+0

Вы сказали, что Dynamic sql может решить эту проблему. Как бы вы это сделали? – avi

Смежные вопросы