2013-02-04 86 views
2

我需要一個簡單的函數來返回動態的一組列。我發現在SO幾個例子,並具有下列結束:查詢結構與函數結果類型不匹配,返回表

CREATE or replace FUNCTION getColumn(_column1 text, _column2 text, _column3 text, _table text) 
    RETURNS TABLE(cmf1 text, cmf2 text, cmf3 text) AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 
     'SELECT ' 
      || quote_ident(_column1)::text || ' as cmf1,' 
      || quote_ident(_column2)::text || ' as cmf2,' 
      || quote_ident(_column3)::text || ' as cmf3' 
     ' FROM ' 
      || quote_ident(_table); 
END; 
$$ LANGUAGE plpgsql; 

我需要這個功能,只爲varchar /文本列工作,所以我創造了這個測試表:

create table test20130205 (
    a text, 
    b text, 
    c varchar, 
    d text) 
; 

最後,我可以運行一些測試:

select * from getColumn('a','b','d','test20130205'); 
-- ok 
select * from getColumn('a','b','c','test20130205'); 
-- error 
ERROR: structure of query does not match function result type 
DETAIL: Returned type character varying does not match expected type text in column 3. 
CONTEXT: PL/pgSQL function getcolumn(text,text,text,text) line 3 at RETURN QUERY 

好像類型列c(VARCHAR)鑄造前檢查 - 這似乎很奇怪,但我想我已經錯過了一些東西。

我該如何解決我的功能?

(PostgreSQL的9.1)

回答

5

在當前的功能,強制轉換爲文本並不適用於輸出列中的值,它們適用於他們的名字(的quote_ident的結果)。

CREATE or replace FUNCTION getColumn(_column1 text, _column2 text, _column3 text, _table text) 
    RETURNS TABLE(cmf1 text, cmf2 text, cmf3 text) AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 
     'SELECT ' 
      || quote_ident(_column1) || '::text as cmf1,' 
      || quote_ident(_column2) || '::text as cmf2,' 
      || quote_ident(_column3) || '::text as cmf3' 
     ' FROM ' 
      || quote_ident(_table); 
END; 
$$ LANGUAGE plpgsql; 

演員應該查詢本身內部移動