2017-07-07 36 views
1

我想寫一個「通用」函數,將返回任何枚舉(在任何架構)的標籤...但我沒有太多的運氣,因爲我不知道又該參數類型是...PostgreSQL - 函數,返回任何ENUM的標籤

這樣做的目的是能夠調用函數這樣

SELECT common.get_enum_labels('public.rainbow_colors'); 
SELECT common.get_enum_labels('audit.user_actions'); 

這是我有這麼

CREATE OR REPLACE FUNCTION common.get_enum_labels(enum_name regtype) 
RETURNS SETOF text AS 
$$ 
BEGIN 
    EXECUTE format('SELECT unnest(enum_range(NULL::%s))::text AS enum_labels ORDER BY 1', enum_name); 
END; 
$$ 
LANGUAGE plpgsql 
STABLE 
PARALLEL SAFE 
; 

任何提示WOU LD理解

回答

2

參數類型應該是regtype,不要忘了從功能

CREATE OR REPLACE FUNCTION get_enum_labels(enum_name regtype) 
RETURNS SETOF text AS 
$$ 
BEGIN 
    RETURN QUERY 
     EXECUTE format('SELECT unnest(enum_range(NULL::%s))::text ORDER BY 1', enum_name); 
END; 
$$ 
LANGUAGE plpgsql 
+0

威爾文字易於受到SQL注入返回的東西?有沒有我應該使用的適當的對象標識符類型?我正在問,因爲[這個答案](https://stackoverflow.com/a/10711349/481904) – zam6ak

+0

是的,你說得對。 'regtype'更安全。 – klin

1
create or replace function get_enum_labels(enum_name regtype) 
    returns setof text language sql stable 
as $$ 
    select enumlabel::text 
    from pg_enum 
    where enumtypid = enum_name 
    order by enumsortorder 
$$;