Как создать хранимую функцию, чтобы она могла вернуть разные типы?
В возвращаемой таблице второй столбец типа INTEGER:
CREATE OR REPLACE FUNCTION foo(str VARCHAR) RETURNS TABLE (key INTEGER, value INTEGER) AS $$ DECLARE -- BEGIN -- END; $$ LANGUAGE plpgsql; |
CREATE OR REPLACE FUNCTION foo(str VARCHAR) RETURNS TABLE (key INTEGER, value INTEGER) AS $$ DECLARE -- BEGIN -- END; $$ LANGUAGE plpgsql;
В возвращаемой таблице второй столбец типа FLOAT:
CREATE OR REPLACE FUNCTION foo(str VARCHAR) RETURNS TABLE (key INTEGER, value FLOAT) AS $$ DECLARE -- BEGIN -- END; $$ LANGUAGE plpgsql; |
CREATE OR REPLACE FUNCTION foo(str VARCHAR) RETURNS TABLE (key INTEGER, value FLOAT) AS $$ DECLARE -- BEGIN -- END; $$ LANGUAGE plpgsql;
Дополнительно:
Возвращать объемлющий тип, и CAST в нужный в точке потребления.
Можно, но есть неудобство при вызове таких функций:
CREATE OR REPLACE FUNCTION public.foo(str character varying) RETURNS SETOF record LANGUAGE plpgsql AS $$ BEGIN IF str = 'i' THEN RETURN QUERY SELECT i, i*i FROM generate_series(1, 10) i; ELSE RETURN QUERY SELECT i, SQRT(i::float) FROM generate_series(1, 10) i; END IF; END; $$ # select * from foo('i') as (key int, value int); key | value -----+------- 1 | 1 2 | 4 3 | 9 4 | 16 5 | 25 6 | 36 7 | 49 8 | 64 9 | 81 10 | 100 (10 rows) # select * from foo('x') as (key int, value float); key | value -----+-------------------- 1 | 1 2 | 1.4142135623730951 3 | 1.7320508075688772 4 | 2 5 | 2.23606797749979 6 | 2.449489742783178 7 | 2.6457513110645907 8 | 2.8284271247461903 9 | 3 10 | 3.1622776601683795 (10 rows) |
CREATE OR REPLACE FUNCTION public.foo(str character varying) RETURNS SETOF record LANGUAGE plpgsql AS $$ BEGIN IF str = 'i' THEN RETURN QUERY SELECT i, i*i FROM generate_series(1, 10) i; ELSE RETURN QUERY SELECT i, SQRT(i::float) FROM generate_series(1, 10) i; END IF; END; $$ # select * from foo('i') as (key int, value int); key | value -----+------- 1 | 1 2 | 4 3 | 9 4 | 16 5 | 25 6 | 36 7 | 49 8 | 64 9 | 81 10 | 100 (10 rows) # select * from foo('x') as (key int, value float); key | value -----+-------------------- 1 | 1 2 | 1.4142135623730951 3 | 1.7320508075688772 4 | 2 5 | 2.23606797749979 6 | 2.449489742783178 7 | 2.6457513110645907 8 | 2.8284271247461903 9 | 3 10 | 3.1622776601683795 (10 rows)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для создания хранимой функции, которая может возвращать разные типы данных, вы можете воспользоваться возможностями языка программирования, в данном случае PHP.
Прежде всего, вам нужно определить тип данных, который функция будет возвращать. Вы можете использовать ключевое слово "mixed" для указания того, что функция может вернуть разные типы данных. Например:
CREATE FUNCTION myFunction() RETURNS mixed BEGIN DECLARE result mixed; -- ваш код здесь RETURN result; END
Затем внутри тела функции вы можете определить логику, которая будет возвращать разные типы данных в зависимости от условий. Например:
CREATE FUNCTION myFunction() RETURNS mixed BEGIN DECLARE result mixed; IF условие THEN SET result = 'строковое значение'; ELSE SET result = 123; -- числовое значение END IF; RETURN result; END
Таким образом, вы можете создать хранимую функцию, которая будет возвращать разные типы данных в зависимости от условий. Не забудьте проверить синтаксис вашего кода и удостовериться, что функция работает корректно перед использованием её в вашем проекте.