CSV в postgresql с использованием хранимой процедуры

Я хочу скопировать csv в базу данных, используя хранимую процедуру. Моя функция следующая;

CREATE FUNCTION gis_portal.copycsv(IN path text) RETURNS void AS
'COPY gis_portal.temp_excel FROM path WITH DELIMITER'
LANGUAGE sql VOLATILE LEAKPROOF;

запрос

COPY gis_portal.temp_excel FROM path WITH DELIMITER ',' CSV HEADER

с параметром path.

Это дает ошибку как синтаксическую ошибку рядом с путем при создании функции.

Пожалуйста помогите.


person Community    schedule 17.02.2014    source источник
comment
Всегда показывайте полный и точный текст ошибки.   -  person Craig Ringer    schedule 17.02.2014


Ответы (1)


'COPY gis_portal.temp_excel FROM path WITH DELIMITER'
                                           ^^^^^^^^^^

Какой разделитель? Вы должны указать его, если используете это ключевое слово.

Пытаться:

CREATE FUNCTION gis_portal.copycsv(IN path text) RETURNS void AS $$
COPY gis_portal.temp_excel FROM path WITH DELIMITER ','
$$ LANGUAGE sql;

или любой другой разделитель, который вы хотите.

Кроме того, в функциях SQL вы не можете использовать идентификатор, вы должны использовать позиционный параметр, например $1. Но поскольку COPY не является планируемым оператором, вы не можете использовать в нем параметры. Вам придется использовать PL/PgSQL и EXECUTE, чтобы запустить его как динамический SQL:

CREATE FUNCTION gis_portal.copycsv(IN path text) RETURNS void AS $$
BEGIN
  EXECUTE format('COPY gis_portal.temp_excel FROM %L WITH DELIMITER '',''', path);
END;
$$ LANGUAGE plpgsql;

Обратите внимание на двойные кавычки вокруг разделителя, потому что теперь это строка SQL.

person Craig Ringer    schedule 17.02.2014
comment
Получил ошибку ОШИБКА: синтаксическая ошибка в пути или рядом с ним Состояние SQL: 42601 Символ: 101 - person ; 18.02.2014
comment
@Santhucool ах, да. В функциях SQL вы не можете использовать идентификатор, вы должны использовать позиционный параметр, например $1. - person Craig Ringer; 19.02.2014