В Oracle я хочу экспортировать таблицы с помощью dbms_datapump. У меня есть таблица, содержащая список имен таблиц, подмножество которых я хочу экспортировать, где grp = 'batch1'. Я хочу просмотреть каждое из этих имен таблиц и передать имя таблицы в метаданные_filter. Однако это не работает. Я специально хочу сделать это в цикле.
Вот некоторые выдержки из кода:
CURSOR lib_cur IS
SELECT table_name
FROM my_table_list
WHERE grp = 'batch1';
Далее в коде:
for x in lib_cur
LOOP
table_nm := x.table_name;
dbms_datapump.metadata_filter
(handle => my_job_handle,
name => 'NAME_EXPR',
value => 'IN (''' || table_nm || ''')' ,
object_type => null);
Кто-нибудь знает, почему текущее значение table_nm не передается в параметр значения dbms_datapump.metadata_filter? Если я жестко закодирую одно из фактических имен таблиц, которые я хочу, например. «таблица1» работает нормально.
Я знаю, что мой цикл переносит правильные имена таблиц в переменную table_nm, поскольку я вывожу их в dbms_output и вижу, что на каждой итерации цикла появляется другое имя таблицы.
Есть идеи, почему имя не передается в моем цикле? Я не знаю, синтаксис неправильный или так сделать просто невозможно? Дело в том, что я уверен, что некоторое время назад у меня это работало!
Вы точно заменяете переменную table_name на ''table1''? или с 'table1' ? Нижние или прописные буквы, и соответствует ли это тому, что у вас в таблице my_table_list? Каков тип данных переменной table_name? varchar2 или char? Пробовали ли вы использовать x.table_nm в конкатенации вместо отдельной переменной?





Вы заменяете фильтр каждый раз в своем цикле. Вы хотите предоставить весь список сразу. Попробуйте использовать LISTAGG, чтобы собрать список таблиц с разделителями в одну скалярную переменную, которую можно передать фильтру:
SELECT 'IN ('''||LISTAGG(table_name,''',''') WITHIN GROUP (ORDER BY 1)||''')'
INTO var_table_list
FROM my_table_list
WHERE grp = 'batch1';
dbms_datapump.metadata_filter
(handle => my_job_handle,
name => 'NAME_EXPR',
value => var_table_list,
object_type => null);
Спасибо, Пол. Если я заменяю фильтр каждый раз, когда прохожу цикл, не должен ли он сработать хотя бы один раз, поскольку он выберет самую последнюю переданную таблицу и экспортирует ее? Потому что, похоже, он этого не делает.
@Reindeer, мы слишком многого не видим, чтобы ответить на этот вопрос. Мы не можем видеть содержимое my_table_list, не можем сравнивать чувствительность к регистру в именах таблиц и не можем проверять фактические результаты, которые вы интерпретируете как неправильные. Вполне возможно, что происходит что-то еще, но для решения этой проблемы недостаточно информации для отладки. Кстати, dbms_metadata использовать гораздо сложнее, чем команду ОС expdp. Важно ли управлять этим с помощью PL/SQL, а не использовать утилиту expdp?
Истинный. Я управляю им из PL/SQL. Я пока откажусь от идеи использования LOOP и просто пройдусь по полному списку. Кажется, на данный момент это работает нормально!
@Reindeer, в этом суть моего ответа: цикл не работает. Каждый вызов перезаписывает предыдущий.
Только что проверил, лишних пробелов точно нет