2012-03-09 3 views
1

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

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) 

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

EDIT: У меня есть 2 сценария, который является общим и должен быть установлен как без изменений. Он должен быть установлен в нескольких местах. Второй вариант - это сценарий конфигурации.

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

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

Thanks

ответ

1

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

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

EDIT (после уточнения вопроса): ОК - вы хотите переименовать столбцы для конкретных клиентов или сайтов или некоторых таких. Либо обернуть исходную функцию в виде:

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

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

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

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

+0

Отредактировано, но кажется, что у меня бесконечная петля, и я не думаю, что это будет возможно. –

+0

Я что-то понял. Я просто использую этот процесс установки: установите скрипт configure, который создает типы, а затем вызывает вызовы другого скрипта, после того как это будет закончено, тогда сделайте вставки –

1

Это, как правило, невозможно в PostgreSQL. Привожу инструкцию по CREATE FUNCTION:

Кроме того, CREATE OR REPLACE FUNCTION не позволит вам изменить тип возврата существующей функции. Чтобы сделать это, вы должны снимите и заново создайте функция. (При использовании OUT параметров, это означает, что вы не можете изменить типы любых параметров, за исключением того, понижая функцию.)

Жирный курсив мой. Чтобы облегчить процесс (и удалить связь между типом и функцией), вы можете использовать OUT parameters or 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; 

Как и в сторону: Мой личный совет, чтобы всегда пользователь lower case identifiers в PostgreSQL. Я переименовал столбцы OUT соответственно в примере.

2

Я пробовал с 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 

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

+0

. Мы используем версию 9.0 и, похоже, не работаем, сомневаемся, что у них будет какая-то вероятность из sysadmin, обновляющего его, спасибо, хотя –

+0

Действительно, он не может работать с PG 9.0 из-за отсутствия предложения RENAME ATTRIBUTE в ALTER TYPE (согласно документу: http://www.postgresql.org/docs/9.0/ статический/SQL-altertype.html) –

Смежные вопросы