Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сгенерировать имя файла для COPY / 7 сообщений из 7, страница 1 из 1
29.08.2007, 18:14
    #34762724
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Необходимо сгенерировать имя файла в 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
29.08.2007, 18:31
    #34762776
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Сложно ответить только по приведенному вами коду. Вы уверены, что подставляете имя файла в конец path_to?
У меня похожая конструкция работает на ура.
...
Рейтинг: 0 / 0
30.08.2007, 09:17
    #34763401
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Можно увидеть Вашу конструкцию? Моя в том виде, в котором я написал (даже ничего не меняя в коде - не работает)
...
Рейтинг: 0 / 0
30.08.2007, 13:51
    #34764549
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Вот моя версия (лишнее порезано). Обратите внимание, что новую директорию надо сначала создать физически (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
30.08.2007, 17:48
    #34765678
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Код: 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
30.08.2007, 18:45
    #34765879
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Нашел ошибку. в данном случае нельзя использовать AS ' ... ' . Нужно что то вроде $BODY$, как у вас. В других процедурах такой проблемы не вылазило...
...
Рейтинг: 0 / 0
30.08.2007, 18:52
    #34765893
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгенерировать имя файла для COPY
Robert AyrapetyanНашел ошибку. в данном случае нельзя использовать AS ' ... ' . Нужно что то вроде $BODY$, как у вас. В других процедурах такой проблемы не вылазило...

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


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