Я работаю над Oracle 11g. Я получаю запрос пользователя, например.Как переназначить исходную таблицу запроса на другую таблицу программно
SELECT mycolumn
FROM myschema.mytable
Запрос может быть произвольно сложным с подзапросами и не известен заранее. Теперь я хочу изменить запрос и перенаправить все использования исходной таблицы mytable
на другую таблицу mytable_mod
независимо от того, где в запросе или в подзапросе они возникают.
Конечно, вы можете найти строку для возникновения mytable
, но это весьма ненадежный подход, так как другие части запроса может иметь такое же имя (столбец, например, или некоторые комментарии)
I попытался создать представление с этим утверждением и использовать DBMS_METADATA
для его анализа:
CREATE OR REPLACE VIEW MYSCHEMA.TESTVIEW as
SELECT mycolumn FROM myschema.mytable
с DBMS_METADATA
вы можете заменить схему, как это (после некоторой подготовки):
dbms_metadata.set_remap_param(handler, 'REMAP_SCHEMA',
'MYSCHEMA', 'MY_OTHER_SCHEMA');
С REMAP_NAME
вместо REMAP_SCHEMA
вы можете заменить имя объекта. Но оба метода относятся только к имени вида, а не к объектам, используемым внутри запроса представления. Таким образом, результат будет
CREATE OR REPLACE VIEW MY_OTHER_SCHEMA.TESTVIEW as
SELECT mycolumn FROM myschema.mytable
Другой идеей является вывод представления представления представления как объекта XML. Я получаю все определения столбцов и имя представления, но сам запрос является текстовым тегом в xml. Моя идея состояла в том, чтобы
- извлечь запрос как XML
- заменить объекты, которые я хочу, глядя на свои теги
- используют
DBMS_METADATA.CONVERT
для преобразования XML обратно в DDL заявление.
Но, как я уже сказал, xml не содержит саму структуру sql-запроса. Кто-нибудь знает, как получить оператор sql, структурированный как «объект xml» или в какой-либо другой структурированной форме?
Какова техническая причина изменения QUERY? Почему вы не можете изменить структуру? Например, переименуйте 'myschema.mytable' в' myschema.mytable_old', 'создайте или замените представление myschema.mytable как select * из myschema.mytable_mod' и сохраните запрос неповрежденным? –
Я понимаю, что вы делаете немного лучше, но условный аспект все еще неясен; о каких условиях мы говорим здесь? – Ben
Я использую запрос, потому что пользователь должен увидеть, что что-то изменилось. Когда пользователь ссылается на mytable, он всегда должен получать оригинальную таблицу. – markop