Microsoft SQL Server, PostgreSQL

Функция, возвращающая таблицу returns table — в PostgreSQL и MS SQL Server

Хочу сегодня привести примеры создания функций для СУБД Microsoft SQL Server и PostgreSQL. Функция возвращает таблицу с 3-мя полями.

Как это пишется в MS SQL Server:

CREATE FUNCTION dbo.myFunction (--variables list--)
RETURNS result_table TABLE(field1 integer, field2 integer, field3 integer) 
AS
BEGIN
	insert into result_table 
	select val1, val2, val3 from another_table;
	return;
END;

А вот так в PostgreSQL:

CREATE OR REPLACE FUNCTION public.get_count_in_batch(--variables list--)
    RETURNS TABLE(field1 integer, field2 integer, field3 integer) 
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    ROWS 1000
AS $BODY$
begin
	return query select val1, val2, val3 from another_table;
end;
$BODY$;

Конечно, здесь примеры сокращены до минимума, только лишь с целью показать механизм возврата результата.

И еще

В случае с MS SQL Server, если есть необходимость в промежуточных каких-то вычислениях, можно воспользоваться переменной временной таблицы и регистрировать там какие-то промежуточные результаты. Затем «перебросить» значения из нее в результирующую таблицу:

declare t table (temp_field1 int, temp_field2 int, temp_field3 int);
...
insert into result_table
select * from t;
return;

В PostgreSQL все проще: можно использовать «сложносочиненные» запросы и просто вернуться в качестве выборки (упрощенный пример):

return query select product_code, 
(select sum(cost)*10 from kassa where product_id = pId), 
(select sum(amount) from store where product_id = pId)
from products
where product_id = pId;

Функция, возвращающая таблицу returns table — в PostgreSQL и MS SQL Server: 3 комментария

  1. Добрый день.

    По Вашему примеру функция возвращается один столбец, которые содержит в себе данные столбцов таблицы через запятую. Как можно сделать, чтобы на выходе было несколько столбцов?

Оставьте своё мнение...

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.