2016-03-29 1 views
0

Я получаю все встроенные и определенные пользователем типы, чтобы использовать результирующий список типов как возможные значения для нового пользовательского типа ENUM.Создайте тип ENUM из результата запроса

SELECT pg_catalog.format_type(t.oid, NULL) into TYPES_NAMES 
FROM pg_catalog.pg_type t 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM 
pg_catalog.pg_class c WHERE c.oid = t.typrelid)) 
AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid =  
t.typelem AND el.typarray = t.oid) 
AND pg_catalog.pg_type_is_visible(t.oid); 

Как я могу использовать список результирующих типов как возможные значения, что новый ENUM типа может иметь.

CREATE TYPE my_enum AS ENUM (....); 

Я использую PostgreSQL 9.5.0

Благодарности

ответ

1

Вы можете перебирать значения в plpgsql и добавить их в перечислении с:

ALTER TYPE name ADD VALUE 'value'; 
+0

благодарит за ответ. Я мог бы сделать это, итерируя ценности. – saloua

0

Я мог бы сделать это с инлайн команду, итерируя значения thx на ответ Дмитрия.

DO $$ 
DECLARE name text; 
BEGIN 
    -- create an empty type then add the possible values 
    EXECUTE 'CREATE TYPE data_types_enum AS ENUM()'; 
    FOR name IN 
    SELECT pg_catalog.format_type(t.oid, NULL) as TYPES_NAMES 
    FROM pg_catalog.pg_type t 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
    WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM 
    pg_catalog.pg_class c WHERE c.oid = t.typrelid)) 
    AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = 
    t.typelem AND el.typarray = t.oid) 
    AND pg_catalog.pg_type_is_visible(t.oid) 
    LOOP 
    -- add the possible types 
    EXECUTE 'ALTER TYPE data_types_enum ADD VALUE ''' ||name|| ''''; 
    END LOOP; 
END $$;