PostgreSQL: возможно создать функцию с ТИПОМ и изменить ТИП после - PullRequest
1 голос
/ 09 марта 2012

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

CREATE TYPE my_type AS ("Column1" text, "Column2" text);

CREATE OR REPLACE FUNCTION my_fucntion()
RETURNS SETOF my_type
bla
bla
blah

ALTER TYPE my_type AS ("Name" text, "Address" text)

Возможно ли это? изменения всегда будут только именем столбца, а не фактическим форматом данных, который всегда будет одинаковым.

РЕДАКТИРОВАТЬ: Ну, дело в том, что у меня есть 2 сценария, один из которых является общим и должен быть установлен как есть без изменений. Он должен быть установлен в нескольких местах. Второй вид сценария конфигурации.

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

Сначала я решил установить скрипт конфигурации, но не могу, поскольку мне нужно выполнить некоторые вставки на основе функций, которые есть в универсальном скрипте.

Спасибо

Ответы [ 3 ]

2 голосов
/ 10 марта 2012

Я пытался с PostgreSQL 9.1, и, похоже, просто работает.Пример:

CREATE TYPE my_type as (col1 text, col2 text);
CREATE TABLE my_table (a my_type);
INSERT INTO my_table values(('ab','cd'));
CREATE FUNCTION my_function() returns setof my_type as 
    'begin return query select (a).* from my_table; end;'
language plpgsql;

select * from my_function();

Вывод:

 col1 | col2 
------+------
 ab   | cd

Теперь давайте переименуем столбцы в my_type:

alter type my_type rename attribute col1 to address;
alter type my_type rename attribute col2 to name;

=> Без ошибок

СейчасВызовите снова функцию:

select * from my_function();

Нет ошибок, вывод:

 address | name 
---------+------
 ab      | cd

Похоже на ожидаемый результат, не так ли?

1 голос
/ 09 марта 2012

Это обычно невозможно в PostgreSQL.Я цитирую руководство по СОЗДАТЬ ФУНКЦИЮ :

Кроме того, СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ не позволит вам изменить тип возврата существующей функции.Для этого вы должны удалить и заново создать функцию.(При использовании параметров OUT это означает, что вы не можете изменять типы каких-либо параметров OUT, кроме как путем удаления функции.)

Мой жирный шрифтЧтобы упростить процесс (и устранить связь между типом и функцией), вы можете использовать OUT параметры или RETURNS TABLE вместо RETURNS SETOF my_type.Например:

CREATE OR REPLACE FUNCTION my_function()
 RETURNS TABLE (column1 text, column2 text) AS
$BODY$
 -- do something
$BODY$ language xyz;

В качестве отступления: мой личный совет - всегда использовать строчные идентификаторы в PostgreSQL.В этом примере я переименовал столбцы OUT соответственно.

1 голос
/ 09 марта 2012

Не вижу, как можно заставить это работать. Все, что зависит от «my_type», сломалось бы, когда вы изменили его определение.

Возможно, опубликуйте еще один вопрос с актуальной проблемой, которую вы пытаетесь решить.

РЕДАКТИРОВАТЬ (после уточнения вопроса): ОК - значит, вы хотите переименовать столбцы для конкретных клиентов или сайтов или чего-то подобного. Либо оберните вашу оригинальную функцию в виде:

CREATE VIEW local_columns AS
SELECT column1 AS foo, column2 as bar FROM my_function()

Если вам нужно передать параметры, перенесите вашу функцию в другой тип и функцию:

SELECT * FROM my_outer_function('some','params')

Ваш файл конфигурации должен будет настроить внешний тип + функцию или представление.

...