2013-05-23 5 views
1

Я ищу помощь с функцией PostgreSQL, которая возвращает таблицу. Я хотел бы знать, есть ли способ обновить возвращаемую таблицу.Таблица обновлений, возвращаемая в PostgreSQL

Вот пример,

create or replace function fn_function() 
return table(column01 integer, column02 integer, column03 boolean) as $$ 
    return query 
    select col1, col2, false 
    from tableXYZ; 


    /* how can i update the table, let's say column03 before the function exits */ 

end 
$$ language plpgsql; 

Могу ли я дать псевдоним таблицы возвращается?

Версия для постгидрата в использовании - 9.0.8.

Thx заранее.

+0

Я думаю, что это может помочь вам: http://stackoverflow.com/questions/4279876/plpgsql-function-returns-table – Cipous

+0

@Cipous Он не сделал. Но все равно. –

ответ

0

Это решение на основе набора.

RETURNS TABLE - это только портал для получения данных, вы ничего не можете сделать внутри функции, которая ее определяет. Вы можете создать другую функцию и вызвать ее и сделать что-то в результирующем наборе. Однако я использую временную таблицу, чтобы вы могли манипулировать данными перед отправкой.

CREATE OR REPLACE FUNCTION fn_function() 
    RETURNS TABLE(column01 integer, column02 integer, column03 boolean) AS $$ 
    BEGIN 

     CREATE TEMP TABLE temp_tableXYZ (column01 integer, column02 integer, column03 boolean) ON COMMIT DROP; 

    INSERT INTO temp_tableXYZ (column01, column02, column03) 
    SELECT col1,col2,col3 
    FROM tableXYZ; 
    --WHERE filter if you can. 

     UPDATE temp_tableXYZ 
     SET col1 = 9999; 

     RETURN QUERY select column01, column02, column03 from temp_tableXYZ; 
    END; 
    $$ LANGUAGE plpgsql; 

Вы можете вызвать его, используя псевдоним, как это:

SELECT * FROM fn_function() as my_table; 
+0

Я не понимаю, как ваш ответ может мне помочь. В моем примере я пытаюсь обновить column03. Предположим, что он основан на возвращаемых результатах. Я новичок в PostgreSQL. Я использовал для программирования в T-SQL. Там я мог бы иметь функцию, которая возвращает переменную типа «таблица», и я мог бы делать вставки, обновления или удалять ее. В Postgre я вижу, что это не так линейно. –

+0

Я вижу, что вы не хотите изменять данные в фактической таблице только те данные, которые выходят из системы. В этом случае я мог бы в вашей функции выбрать данные, которые вы планируете возвращать в таблицу temp, изменить данные в таблице temp и в вашем запросе RETURN QUERY из временной таблицы. Я не верю, что вы можете изменять столбцы, на которые вы ссылаетесь в RETURNS TABLE (целое число столбцов, целое число столбцов02, column03 boolean). – Kuberchaun

+0

Я думал, что у меня есть временная таблица, но разве у меня не было бы проблем с параллелизмом с этим подходом? –

0

Просто сделайте запрос, который возвращает значения, которые вы хотите. Это может быть просто sql:

create or replace function fn_function() 
returns table (
    column01 integer, column02 integer, column03 boolean 
) as $$ 

    select col1, col2, col2 > 10 
    from tableXYZ; 

$$ language sql; 

В приведенном выше примере столбец 3 будет истинным, если col2> 10 и false в противном случае. Другой пример использования подвыбор:

create or replace function fn_function() 
returns table (
    column01 integer, column02 integer, column03 boolean 
) as $$ 

    select col1, col2, (select max(col1) > 10 from t where col2 = tableXYZ.col1) 
    from tableXYZ; 

$$ language sql; 

Обратите внимание, что это не return но returns

+0

Чтобы удовлетворить эту конкретную потребность, я думаю, что подход с подзапросом, о котором вы говорили, окажется достаточным. Но я хотел бы видеть больше универсальности функций Postgre, возвращающих таблицы. Кстати, в чем разница между использованием 'return' и' returns'? спасибо. –

+0

@Hugo 'return table' является синтаксической ошибкой. Для большей гибкости используйте петлю, как в ответе Игоря. –

0

Чтобы выбрать из таблицы, изменять результаты выбора и передать их результаты функции попробовать что-то вроде:

create or replace function fn_function() 
returns table (
    column01 integer, column02 integer, column03 boolean 
) as $$ 
begin 
    for rec in select col1, col2, false as col3 
       from tableXYZ; 
    loop 
     rec.col3 := col1 > col2; 

     return next rec; 
    end loop; 
    return; 
end 
$$ language plpgsql; 

here.

Чтобы выбрать получить результаты этой функции просто

SELECT function_alias.col1, function_alias.col2 
FROM fn_function() function_alias; 

можно сделать с помощью этой функции те же вещи, которые вы можете сделать с обычными таблицами.

+0

С предоставленным кодом я получаю ** Отсутствие «LOOP» в конце выражения SQL **. Я думаю, что это точка с запятой перед циклом слова. Но когда я удаляю, что get, ошибка rec должна быть переменной строки. Если я добавлю 'declare rec tablexyz% rowtype;' я получаю еще одну ошибку: ** RETURN NEXT не может иметь параметр в функции с параметрами OUT **. спасибо. –

+0

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

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