我的问题是我无法在存储过程中运行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
非常感谢任何帮助,谢谢!
答案 0 :(得分:3)
这看起来像Postgres中的一个错误(reference)。它建议使用动态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;