Oracle datapump метаданные_фильтр

В 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 и вижу, что на каждой итерации цикла появляется другое имя таблицы.

Есть идеи, почему имя не передается в моем цикле? Я не знаю, синтаксис неправильный или так сделать просто невозможно? Дело в том, что я уверен, что некоторое время назад у меня это работало!

Только что проверил, лишних пробелов точно нет

Reindeer 23.02.2024 20:59

Вы точно заменяете переменную table_name на ''table1''? или с 'table1' ? Нижние или прописные буквы, и соответствует ли это тому, что у вас в таблице my_table_list? Каков тип данных переменной table_name? varchar2 или char? Пробовали ли вы использовать x.table_nm в конкатенации вместо отдельной переменной?

Paul W 23.02.2024 21:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы заменяете фильтр каждый раз в своем цикле. Вы хотите предоставить весь список сразу. Попробуйте использовать 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 23.02.2024 21:04

@Reindeer, мы слишком многого не видим, чтобы ответить на этот вопрос. Мы не можем видеть содержимое my_table_list, не можем сравнивать чувствительность к регистру в именах таблиц и не можем проверять фактические результаты, которые вы интерпретируете как неправильные. Вполне возможно, что происходит что-то еще, но для решения этой проблемы недостаточно информации для отладки. Кстати, dbms_metadata использовать гораздо сложнее, чем команду ОС expdp. Важно ли управлять этим с помощью PL/SQL, а не использовать утилиту expdp?

Paul W 23.02.2024 21:09

Истинный. Я управляю им из PL/SQL. Я пока откажусь от идеи использования LOOP и просто пройдусь по полному списку. Кажется, на данный момент это работает нормально!

Reindeer 23.02.2024 21:18

@Reindeer, в этом суть моего ответа: цикл не работает. Каждый вызов перезаписывает предыдущий.

Paul W 23.02.2024 21:20

Другие вопросы по теме