Проблема с конкатенацией переменных в postgres с использованием команды copy from - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь вставить в базу данных несколько текстовых файлов с данными json. Каждый файл имеет суффикс 1,2,3 ... и т. Д. (Shape_routes1.json, shape_routes2.json и т. Д.). Для этого я объединяю индекс к базовому имени файла из цикла. Я получаю эту ошибку:

psql:insertshapes.sql:37: ERROR:  syntax error at or near "file_path"
LINE 17: copy temp_json from file_path;

Не можете ли вы предоставить copy from переменную в качестве пути? Или мне нужно что-то сделать с переменной (file_path), чтобы psql знал ее путь? Буду признателен за любую помощь или рекомендации по этому вопросу.

 delete from shapes;

    DO $$

    declare
        n INTEGER := 1;
        prefix TEXT := '/Users/me/model/json/filechunks/shapes_routes';
        i TEXT := NULL;
        file_path TEXT := NULL;

    BEGIN
    LOOP 
    EXIT WHEN n = 166;
    i := CAST(n as TEXT);
    file_path := prefix || i || '.json';
    n := n + 1;

    create temporary table temp_json (values text);
    copy temp_json from file_path; --GETTING ERROR ON THIS LINE
    insert into shapes

    select  values->>'shape_id' as shape_id,
            (CAST(values->>'shape_pt_lat' as real)) as shape_pt_lat,
            (CAST(values->>'shape_pt_lon' as real)) as shape_pt_lon,
            (CAST(values->>'shape_pt_sequence' as integer)) as shape_pt_sequence,
            (CAST(values->>'shape_dist_traveled' as real)) as shape_dist_traveled,
            values->>'route_id' as route_id

    from   (
            select json_array_elements(replace(values,'\','\\')::json) as values 
            from   temp_json
           ) a;

    drop table temp_json;
    END LOOP; 
    END $$;

1 Ответ

0 голосов
/ 05 июля 2018

COPY требует строкового литерала, вы не можете использовать подвыбор для имени файла.

если вам нужно изменить имя файла, вам нужно использовать динамический sql, (EXECUTE)

например:

EXECUTE 'copy temp_json from '||quote_literal(file_path);
...