6
這PostgreSQL的COPY命令的工作:在PostgreSQL的COPY命令動態生成的表名
copy tablename from E'c:\\abc\\a.txt';
,但我想動態生成的表名。我怎樣才能做到這一點?
這PostgreSQL的COPY命令的工作:在PostgreSQL的COPY命令動態生成的表名
copy tablename from E'c:\\abc\\a.txt';
,但我想動態生成的表名。我怎樣才能做到這一點?
您需要構建一個字符串,並在動態表名中進行連接,然後使用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
你舉的例子,實際的代碼演示了動態生成的文件名,而不是一個動態生成的表名。此外,您不提到您的示例代碼指定了逗號分隔的輸出,而不是默認的製表符分隔的輸出。 (你是否從別的地方複製你的示例代碼?) – ruakh 2011-12-19 17:55:57