powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование кодировки в функции
9 сообщений из 9, страница 1 из 1
Использование кодировки в функции
    #39195791
DenLaDenPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день.

Я пользовался поиском, но не нашёл ничего подобного, гугл и яндекс то же внятного не показывают.
Проблема в том, что не могу разобраться в логике происходящего.

С оборудования приходят файлы в кодировке ANSII-1251, БД работает с кодировкой UTF-8.
Файлов каждый раз приходит новое количество, может 5, может 10 и т.д. рандомно. Перед запуском процедуры на CRON-e запускается команда, которая создает в той же директории файлик DIR.txt с перечнем файлов данной директории. Сама функция сначала импортирует файлик DIR.txt, запоминает имена файлов и в цикле формирует команду COPY FROM с именами этих файлов.
Код: plsql
1.
2.
3.
4.
5.
-- Перебираем файлы
Faylo := 'COPY "STX_Import_test"("Collum_1") FROM ''/home/public/'||trim(Addres_String[i])||'''';
-- 1. Импорт файла
		set client_encoding='WIN1251';
		EXECUTE Faylo;


Далее в этом же цикле запускается SELECT, который преобразует полученные данные и переносит их уже в таблицу-приемник. Зачищается таблица для импорта файла и цикл начинает следующий шаг.

А проблема у меня в том, что первый шаг цикла отрабатывается на отлично, а вот начиная со второго возникает ошибка:
Код: plsql
1.
2.
********** Ошибка **********
SQL-состояние: 58P01


Данная ошибка говорит о неправильной расстановке кодировок.
Листинг программы:
Код: plsql
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.
-- <<< META-DATA >>> --	
	-- Найти имена файлов
		Faylo := 'COPY "STX_Import_test"("Collum_1") FROM ''/home/public/dir.txt''';
	-- 1. Импорт файла с содержимом каталога
		set client_encoding='WIN1251';  -- Меняем кодировку
		EXECUTE Faylo;
		RESET client_encoding;-- Возвращаем кодировку
	-- 2. Запоминаем имена файлов
		<Немного кода ( который не особо важен) для заполнения массива именами файлов в цикле
				Addres_String[i] := ...;  
                  Так же заполнение количества файлов для обработки в переменную String_Value >
				
---- <<< DATA >>> ------- Сами файлы
	i := 1;
	Loop
		Delete from "STX_Import_test";
		-- Перебираем файлы
		Faylo := 'COPY "STX_Import_test"("Collum_1") FROM ''/home/public/'||trim(Addres_String[i])||'''';
		-- 1. Импорт файла
	set client_encoding='WIN1251';
		EXECUTE Faylo;
	RESET client_encoding;
		-- Переобразование
	< Всякие преобразования для удаления лишнего > 
		-- 3.1. Предчистка
		Delete from STX_1_Import_Transform where trim("KEYDT") = trim(Addres_String[i]);
		-- 3.2. Вносим данные		
		Insert into STX_1_Import_Transform ( <...>)
		SELECT <с преобразованием данных>;

		i := i + 1;
	EXIT WHEN i > String_Value;  
	END LOOP;


Не могу понять, почему возникает проблема именно начиная со второго шага. Буду презнателен за помощь.
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39195814
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БenLaDenProПеред запуском процедуры на CRON-e запускается командаЗачем формировать dir.txt и его разбирать, а не сразу формирвать и выполнять copy или запускать функцию с переданным именем файла? Функцию-то кто запускает в итоге?

Зачем щелкать клиент-энкодингом, когда есть параметр у copy?
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39195863
DenLaDenPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я новичек в PG, copy пользуюсь впервые. Буду рад за подсказки.
p2.Зачем формировать dir.txt и его разбирать, а не сразу формирвать и выполнять copy или запускать функцию с переданным именем файла?

Как мне "увидеть" имена файлов в каталоге средством PG?
p2.Функцию-то кто запускает в итоге?

Да, раз в сутки функция будет дергаться планировщиком заданий Linux - CRONTAB.
p2.Зачем щелкать клиент-энкодингом, когда есть параметр у copy?

Подскажите, пожалуйста, как должна выглядеть строка для ANSII-1251:
Код: plsql
1.
COPY "STX_Import_test"("Collum_1") FROM '/home/public/chtoto.txt';
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39197206
DenLaDenPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за намеки, моя результирующая строка для цикла приняла вид:
Код: plsql
1.
Faylo := 'COPY "STX_Import_test"("Collum_1") FROM ''/home/public/'||trim(Addres_String[i])||''' WITH ENCODING ''WIN1251''';


А ошибка, соответственно была устранена.

Но вот за подсказки о работе с файловой системой, что бы без файла CRON-a получать имена файлов в каталоге средствами PG, был бы признателен. =/
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39197218
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenLaDenProКак мне "увидеть" имена файлов в каталоге средством PG?


Только это должно в пределах pg_data лежать, насколько помню.
Код: plsql
1.
2.
3.
4.
select file,
pg_read_file(file, 0, 100000000)::TEXT
from (select pg_ls_dir('./xml-dir') as file)as ls
where file like '%.xml'
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39197322
DenLaDenPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В pg_data меня не пустят, мне доступна только папка на сервере с PG, туда сбрасываются .txt, выгруженные с оборудования. Количество фафйлов каждый раз разное, имена то же. :(

Как средствами PG можно прочесть конкретный каталог?
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39197347
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenLaDenPro
Как средствами PG можно прочесть конкретный каталог?

Код: perl
1.
opendir(DIR,$local_dir) or die "Error\n Can't open dir $local_dir "; #открываем дирикторию
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39197360
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenLaDenProКак средствами PG можно прочесть конкретный каталог?
Если у вас нет прав что-то делать на сервере, кроме как в psql, за пределами pg_data можно plperlu использовать.
...
Рейтинг: 0 / 0
Использование кодировки в функции
    #39197370
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

мухаха, на третий год граммарнаци заметил копипасту ашипке

пепел голова сыпать мало мало
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование кодировки в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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