powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Перенос данных из одной таблицы в другую, находящихся на разных БД
8 сообщений из 8, страница 1 из 1
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35282885
KatrinOgonek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Структура и наименование таблицы неизвестна, но таблицы одинкаовые на разных БД
Входные параметры: in_table_name, in_condition и in_schemaname;
Кусок функции:
for v_rec in execute $$ select * from $$ || in_table_name || $$ where $$ || in_condition
LOOP
v_cnt := v_cnt + 1;
v_sql := $$INSERT INTO $$ || in_table_name || $$ VALUES ($$;
v_cnt_r := 0;
for v_rec_field in execute $$ select * from pg_stats where schemaname = '$$ || in_schemaname || $$'
and tablename = '$$ || in_table_name || $$'$$
loop
v_cnt_r:= v_cnt_r + 1;
v_text_r := v_rec.v_rec_field.attname;

if v_cnt_r = 1 then v_sqlmain_r := v_text_r;
else v_sqlmain_r := v_sqlmain_r ||$$, $$|| v_text_r;
end if;
end loop;
v_sql := v_sql || v_sqlmain_r ||$$ ); $$;
if v_cnt=1 then
v_sqlmain := v_sql;
else
v_sqlmain := v_sqlmain || ' ' || v_sql;
end if;
END LOOP;

Проблема в том, что естественно он ругается на запись:
v_text_r := v_rec.v_rec_field.attname; - нет в v_rec поля v_rec_field.attname
Вопрос: Как передать туда динамическую переменную v_rec_field.attname, чтобы передалось значение, а не имя переменной?
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35282967
KatrinOgonek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправка: Собственно это формирование скрипта для переноса данных
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35283100
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KatrinOgonekПроблема в том, что естественно он ругается на запись:
v_text_r := v_rec.v_rec_field.attname;
Код: plaintext
v_text_r := (v_rec.v_rec_field).attname;

З.Ы.
Моё ИМХО :) строки лучше воспринимаются в кавычках, чем в баксах :)
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35283124
KatrinOgonek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ERROR: record "v_rec" has no field "v_rec_field"

v_rec_field - это переменная в которой хранится имя поля, как её оттуда достать?..хз..
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35283166
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем,
сначала получаем список полей таблицы
Код: plaintext
1.
for v_rec_field in execute $$ select * from pg_stats where schemaname = '$$ || in_schemaname || $$'
and tablename = '$$ || in_table_name || $$'$$ 
потом формируем динамический запрос
Код: plaintext
for v_rec in execute 'select ' || v_rec_field.attname || ' AS value from ' ||  in_table_name ||  ' where ' || in_condition
потом получаем доступ к полю через v_rec.value
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35283295
KatrinOgonek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот написала я такую вещь, учитываю последнее сообщение:
for v_rec_field in execute $$ select * from pg_stats where schemaname = '$$ || in_schemaname || $$'
and tablename = '$$ || in_table_name || $$'$$
LOOP
v_cnt := v_cnt + 1;
v_sql := $$INSERT INTO $$ || in_table_name || $$ VALUES ($$;
v_cnt_r := 0;
for v_rec in execute $$ select $$ || v_rec_field.attname || $$ AS value from $$ || in_table_name || $$ where $$ || in_condition
loop
v_cnt_r:= v_cnt_r + 1;

v_text_r := v_rec.value;
if v_cnt_r = 1 then v_sqlmain_r := v_text_r;
else v_sqlmain_r := v_sqlmain_r ||$$, $$|| v_text_r;
end if;
end loop;
v_sql := v_sql || v_sqlmain_r ||$$ ); $$;
if v_cnt=1 then
v_sqlmain := v_sql;
else
v_sqlmain := v_sqlmain || ' ' || v_sql;
end if;
END LOOP;



И выдает ошибку type of "v_rec.value" does not match that when preparing the plan, первый раз с таким сталкиваюсь(
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35283314
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KatrinOgonekИ выдает ошибку type of "v_rec.value" does not match that when preparing the plan, первый раз с таким сталкиваюсь(Да, известная фича постгреса :(. Но лечится. Сделайте явное приведение типа
Код: plaintext
for v_rec in execute 'select ' || v_rec_field.attname || '::varchar AS value from ' ||  in_table_name ||  ' where ' || in_condition
...
Рейтинг: 0 / 0
Перенос данных из одной таблицы в другую, находящихся на разных БД
    #35283493
KatrinOgonek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое!
Только проблема в том, что теперь выводится хрень типа:
INSERT INTO tbl_fio VALUES('first name');
INSERT INTO tbl_fio VALUES('second name');
По значениям вставляет..а не целой строкой..надо думать
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Перенос данных из одной таблицы в другую, находящихся на разных БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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