2013-10-11 3 views
1

Моя проблема в том, что я не могу запустить инструкцию COPY внутри хранимой процедуры, и я не знаю почему.Операция 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

глядя на http://www.postgresql.org/message-id/[email protected], кажется, что это ошибка. Это предполагает использование динамического sql в качестве обходного пути. – Laurence

ответ

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; 
+1

этот подход работал отлично, это просто позор, что это необходимо, но хорошо, спасибо! – BrunoJ

Смежные вопросы