2012-02-11 12 views
1

私は頻繁にpostgresqlのコピー機能を使用して、私はそれを利用するための機能を作成するだろうと思った。 それでは、私は関数内のpgsqlコマンドにどのようにパラメータを渡しますか?

create function getUsersCSV() 
RETURNS void AS 
$BODY$ 
    BEGIN 
    COPY (select * from users) 
    TO 'c:\temp\users.csv' 
    WITH HEADER 
    CSV QUOTE '"' DELIMITER ','; 
    END 
$BODY$ 
LANGUAGE PLPGSQL; 

機能の動作を次の表

create table users 
(
    userid serial primary key, 
    prefix varchar(10) not null, 
    firstname varchar(255) not null, 
    lastname varchar(255) not null, 
    email varchar(500) not null, 
    password varchar(255) not null, 
    created timestamp not null, 
    modified timestamp not null 
); 

と、次の機能を持っていますが、私は

create function getUsersCSV(filepath varchar) 
RETURNS void AS 
$BODY$ 
    BEGIN 
    COPY (select * from users) 
    TO filepath 
    WITH HEADER 
    CSV QUOTE '"' DELIMITER ','; 
    END 
$BODY$ 
LANGUAGE PLPGSQL; 

に機能を変更した場合、それは、次の構文エラーをスローしましょう エラー:「ファイルパス」またはその近くの構文エラー SQLの状態:42601

コピーコマンドの宛先値をパラメータ化する方法はありますか?

+0

使用しているPostgreSQLのバージョンは? –

+0

[plpgsql:FROM句への変数の連結]の重複可能性があります(http://stackoverflow.com/questions/6258345/plpgsql-concatenation-of-variable-into-from-clause) –

答えて

2

あなたはexecuteでそれを行うことができます:

create function get_users_csv(filepath text) returns void as $$ 
declare 
    cp_cmd text; 
begin 
    cp_cmd := 'copy (select * from users) to ' 
      || quote_literal(filepath) 
      || ' with header csv quote ''"'' delimiter '','''; 
    execute cp_cmd; 
end; 
$$ language plpgsql; 

は、念のためにあなたのfilepathquote_literalを使用することを忘れないでください。

create function get_users_csv(filepath text) returns void as $$ 
declare 
    cp_cmd text; 
begin 
    cp_cmd := $q$copy (select * from users) to $q$ 
      || quote_literal(filepath) 
      || $q$ with header csv quote '"' delimiter ','$q$; 
    execute cp_cmd; 
end; 
$$ language plpgsql; 

しかし、私は、ドルはテキストのブロック以外にはむしろ醜いように引用符を見つける:あなたはすべての倍単一引用符を好きではない場合にも、ドル引用符を使用することができます。

+0

+1文字列に一重引用符を含める必要がある場合は、祝福。 (したがって、クエリ文字列の最初の部分には必要ありません。) ''(* from users) ''を単に '' users 'に単純化してください。 –

+1

この場合、スーパーユーザーでなければならないため、おそらくセキュリティ定義者機能を使用する必要があります。正確なチェックをしなければ誰かがあなたのデータを破壊する可能性があるので、パスをチェックする必要があります –

関連する問題