powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сгенерировать имя файла для COPY
7 сообщений из 7, страница 1 из 1
Сгенерировать имя файла для COPY
    #34762724
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо сгенерировать имя файла в plpgsql функции для использования в COPY, однако конструкция:

Код: plaintext
1.
2.
3.
DECLARE
   path_to VARCHAR := ''/var/lib/pgsql/data/gen_updates/xxx'';

COPY (...) TO path_to;

не работает.
(path_to генерится динамически в коде - прибавляется время и число)

авторERROR: syntax error at or near "$1"
SQL state: 42601

Есть ли какие-либо варианты?
...
Рейтинг: 0 / 0
Сгенерировать имя файла для COPY
    #34762776
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложно ответить только по приведенному вами коду. Вы уверены, что подставляете имя файла в конец path_to?
У меня похожая конструкция работает на ура.
...
Рейтинг: 0 / 0
Сгенерировать имя файла для COPY
    #34763401
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно увидеть Вашу конструкцию? Моя в том виде, в котором я написал (даже ничего не меняя в коде - не работает)
...
Рейтинг: 0 / 0
Сгенерировать имя файла для COPY
    #34764549
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот моя версия (лишнее порезано). Обратите внимание, что новую директорию надо сначала создать физически (COPY не будет её создавать сам(а)).
Не обращайте внимание на TEMP таблицу, PG 8.1 просто не умеет делать COPY прямо из SELECT'а.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
DECLARE
   v_data_filename     TEXT := 'sql_data.csv';
   v_zip_filename      TEXT := 'sql_data.zip';
   v_status_filename   TEXT := 'sql_status.log';

   v_tmp_table         VARCHAR( 32 );
   v_path              TEXT;
   v_dir               TEXT;
   v_child_status      INTEGER :=  0 ;
BEGIN
   /* Getting base path */
   SELECT param_value
   INTO   v_path
   FROM   csv_configs
   WHERE  param_name = 'ROOT_PATH';

   /* Generate new folder name */
   v_dir := To_Char(current_timestamp, 'YYYYMMDDHH24MISS') || '_';

   WHILE Length(v_dir) <  40 
   LOOP
      v_dir := v_dir || блаблабла с random-ом;
   END LOOP;

   /* Create new dir */
   v_child_status := make_dir_perl (v_path, v_dir);

   IF v_child_status !=  0  THEN
      po_status := 'E: Creation of new dir failed with: ' || v_child_status::VARCHAR;
   END IF;
   v_path := v_path || v_dir || '/';

   /* Create temporary table */
   EXECUTE 'CREATE TEMP TABLE '||v_tmp_table||' AS (' || p_sql || ')';

   /* Start CSV Extraction */
   EXECUTE 'COPY ' || v_tmp_table || '
   TO '''||v_path||v_data_filename||'''
   WITH
   DELIMITER '',''
   NULL ''null''
   CSV HEADER
   QUOTE ''"'' ';

   /* Compressing CSV file */
   v_child_status := compress_file_perl(v_path, v_data_filename, v_zip_filename,  3 );

   RETURN ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;
...
Рейтинг: 0 / 0
Сгенерировать имя файла для COPY
    #34765678
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION "func1" ()
RETURNS BOOLEAN AS '

DECLARE

v_tmp_table         VARCHAR(32);
v_path              TEXT;

BEGIN

EXECUTE 'COPY ' || v_tmp_table || '
   TO '''||v_path||'''
   WITH
   DELIMITER '',''
   NULL ''null''
   CSV HEADER
   QUOTE ''"'' ';

END;

авторERROR: syntax error at or near "COPY"
SQL state: 42601
Character: 156

:(

' LANGUAGE 'plpgsql' SECURITY DEFINER;
...
Рейтинг: 0 / 0
Сгенерировать имя файла для COPY
    #34765879
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел ошибку. в данном случае нельзя использовать AS ' ... ' . Нужно что то вроде $BODY$, как у вас. В других процедурах такой проблемы не вылазило...
...
Рейтинг: 0 / 0
Сгенерировать имя файла для COPY
    #34765893
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Robert AyrapetyanНашел ошибку. в данном случае нельзя использовать AS ' ... ' . Нужно что то вроде $BODY$, как у вас. В других процедурах такой проблемы не вылазило...

Скорее всего вы просто не продублировали кавычки (в вашем случае с AS ' ... ' ). Если у вас PostgreSQL 8.x.x, то используйте $$ ($BODY$), это уменьшит кол-во подобных ошибок и очепяток.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сгенерировать имя файла для COPY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]