2016-06-15 4 views
3

Я перехожу к postgreSQL из MSSQL и все еще разрабатываю синтаксис процедурного программирования. Идея состоит в том, чтобы создать функцию, которая будет принимать таблицу как входной/параметр, выполнить серию операторов SELECT против этой входной таблицы (без временных таблиц, операторы SELECT будут выполняться с CTE) и RETURN финальной таблицы.Передать таблицу функции postgreSQL, выполнить оператор выбора, таблицу возврата

таблица ввода будет очень просто:

Col_1  Col_2  Col_3 
---------------------------- 
2   5   12 

Я хочу использовать каждое из полей в таблице ввода для вычисления числа (в данном примере, суммируя Col_1, Col_2 и Col_3), добавьте это к входной таблицы, и создать таблицу вывода, которая появляется как таковой:

Col 1  Col_2  Col_3  Col_4 
--------------------------------------- 
2   5   12  19 

Моя попытка кода:

CREATE OR REPLACE FUNCTION summing_function(input_table) 
RETURNS output_table(Col_1 INT, Col_2 INT, Col_3 INT, Col_4 INT) AS 
$$ 
SELECT 
    i.* 
    , i."Col_1" + i."Col_2" + i."Col_3" as sum 
INTO output_table 
FROM input_table i 
$$ 
LANGUAGE SQL; 

Очевидно, что все между котировками доллара является неполным/неправильным. Каков правильный синтаксис postgreSQL для куска между долларовыми котировками?

+0

Не вид, что вы хотите использовать вместо этого? (этот вопрос не означает, что вы должны использовать представление, но реальный вопрос от меня, чтобы понять, почему представление не может быть правильным инструментом для использования здесь) –

+0

Вид может быть лучшим решением. Я просто пытался выяснить некоторые общие синтаксисы и ограничения postgreSQL. –

ответ

0

Вы не можете передать «таблицу» в качестве аргумента функции. Вы можете передать имя таблицы в функции PL/PgSQL, а затем запустить dynamic query:

CREATE OR REPLACE FUNCTION summing_function(input_table text) 
    RETURNS TABLE (col_1 int, col_2 int, col_3 int, col_4 int) AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 
     format('SELECT *, col_1 + col_2 + col_3 FROM %I', input_table); 
END; 
$$ LANGUAGE plpgsql;