2011-02-04 79 views

回答

14

您需要構建一個字符串,並在動態表名中進行連接,然後使用execute。請注意,您逃避了'by'。這還包括一個動態名稱來保存文件。您需要將savedir替換爲您正在使用的實際目錄。

CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS $$ 

DECLARE STATEMENT TEXT; 

BEGIN 

    STATEMENT := 'COPY (select * from ' || quote_ident(tablename) || ') to ''savedir' || outname ||'.txt'''; 

    EXECUTE STATEMENT; 

END; 

$$ LANGUAGE 'plpgsql'; 

編輯:

自從我第一次寫這個,我已經發現了格式功能,我認爲這是通常更容易比用連接操作符生成的SQL閱讀||並且更加靈活。

CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS 
$BODY$ 
BEGIN 
    EXECUTE FORMAT('COPY (SELECT * FROM %s) TO ''savedir%s.csv''', 
        tablename, 
        outname); 
END 
$BODY$ 
LANGUAGE plpgsql; 

看到官方文檔進行了充分的討論:https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

+3

你舉的例子,實際的代碼演示了動態生成的文件名,而不是一個動態生成的表名。此外,您不提到您的示例代碼指定了逗號分隔的輸出,而不是默認的製表符分隔的輸出。 (你是否從別的地方複製你的示例代碼?) – ruakh 2011-12-19 17:55:57