1

我的问题是我无法在存储过程中运行 COPY 语句,我不知道为什么。

我的功能:

CREATE OR REPLACE FUNCTION copy_table(mynumber integer)
  RETURNS void AS
$BODY$
DECLARE 
    iNumber integer := 0;

BEGIN   
    iNumber := mynumber;

    RAISE NOTICE 'my number: %', iNumber;

    IF(iNumber <> 0) THEN
        COPY (SELECT * FROM mytable WHERE number = iNumber) TO '/tmp/test.csv' WITH CSV;
    END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION copy_table(integer)
  OWNER TO "owner";

现在,如果我现在这样做:

COPY (SELECT * FROM mytable WHERE number = 2) TO '/tmp/test.csv' WITH CSV

我只是得到了想要的结果,但是如果我使用前面描述的函数:

SELECT copy_table(2)

我得到错误:

NOTICE:  my number: 2


ERROR:  there is no parameter $1
LINE 1: COPY (SELECT * FROM mytable WHERE number =  $1 ) TO '/t...
                                                         ^
QUERY:  COPY (SELECT * FROM mytable WHERE number =  $1 ) TO '/tmp/test.csv' WITH CSV
CONTEXT:  PL/pgSQL function "copy_table" line 10 at SQL statement


********** Error **********

ERROR: there is no parameter $1
SQL state: 42P02
Context: PL/pgSQL function "copy_table" line 10 at SQL statement

任何帮助将不胜感激,谢谢!

4

1 回答 1

4

这看起来像是 Postgres 中的一个错误(参考)。它建议使用动态 SQL 作为解决方法。但是,您不能使用绑定变量。所以,像这样的东西(未经测试,因为我很确定 SQLFiddle 不会让我创建文件)。

Create or replace function copy_table(mynumber integer) returns void as $$
Declare
    sql varchar;
Begin
    If mynumber <> 0 Then
        sql = 'copy (select * from mytable where number = ' 
            || mynumber::varchar || ') to ''/tmp/test.csv'' with CSV;';
        execute sql;
    End if;
End;
$$ Language plpgsql;
于 2013-10-11T21:42:20.120 回答