Как создать хранимую функцию, чтобы она могла вернуть разные типы?

Ссылка скопирована
1 ответ

В возвращаемой таблице второй столбец типа 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)

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для создания хранимой функции, которая может возвращать разные типы данных, вы можете воспользоваться возможностями языка программирования, в данном случае PHP.

Прежде всего, вам нужно определить тип данных, который функция будет возвращать. Вы можете использовать ключевое слово "mixed" для указания того, что функция может вернуть разные типы данных. Например:

CREATE FUNCTION myFunction() RETURNS mixed
BEGIN
    DECLARE result mixed;
 
    -- ваш код здесь
 
    RETURN result;
END

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

CREATE FUNCTION myFunction() RETURNS mixed BEGIN DECLARE result mixed; IF условие THEN SET result = 'строковое значение'; ELSE SET result = 123; -- числовое значение END IF; RETURN result; END

Таким образом, вы можете создать хранимую функцию, которая будет возвращать разные типы данных в зависимости от условий. Не забудьте проверить синтаксис вашего кода и удостовериться, что функция работает корректно перед использованием её в вашем проекте.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно