Предложение Бена использовать replace
кажется довольно разумным, но если вы не хотите этого делать, по какой-то причине вы можете сделать это программно - это скорее больше работы и больше кода.
Поскольку вы используете пакет dbms_metadata
для извлечения DDL, вы можете использовать процедуру set_remap_param, чтобы изменить способ представления DDL; но не так просто использовать для специального запроса как set_transform_param
, поскольку он, похоже, не работает с дескриптором сеанса по умолчанию. Один из вариантов: REMAP_SCHEMA
, поэтому вы можете изменить схему при извлечении DDL, как с насосом данных.
Если создать фиктивную таблицу, установить некоторые простые преобразования на уровне сеанса, а затем вызвать get_ddl
я получаю:
create table t42(id number);
begin
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'PRETTY', value => FALSE);
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'SEGMENT_ATTRIBUTES', value => FALSE);
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'STORAGE', value => FALSE);
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'SQLTERMINATOR', value => TRUE);
end;
/
select dbms_metadata.get_ddl('TABLE', 'T42') from dual;
DBMS_METADATA.GET_DDL('TABLE','T42')
--------------------------------------------------------------------------------
CREATE TABLE "STACKOVERFLOW"."T42" ("ID" NUMBER) ;
который, очевидно, имеет свою схему, STACKOVERFLOW
. С/блок PL SQL можно переназначить, что для того, и я использую SQL * Plus VARIABLE
для извлечения и отображения текста:
variable c clob
declare
l_handle number;
l_transform_handle number;
begin
l_handle := dbms_metadata.open(object_type => 'TABLE');
-- identify the object you want
dbms_metadata.set_filter(l_handle, 'SCHEMA', USER);
dbms_metadata.set_filter(l_handle, 'NAME', 'T42');
-- set up a MODIFY transform and apply REMAP_SCHEMA to it
l_transform_handle := dbms_metadata.add_transform(handle => l_handle,
name => 'MODIFY');
dbms_metadata.set_remap_param(transform_handle => l_transform_handle,
name => 'REMAP_SCHEMA', old_value => USER, new_value => 'ORDER');
-- switch back from XML to DDL
l_transform_handle := dbms_metadata.add_transform(l_handle, 'DDL');
-- set other 'pretty' transforms, to taste
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'PRETTY', value => FALSE);
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'SEGMENT_ATTRIBUTES', value => FALSE);
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'STORAGE', value => FALSE);
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'SQLTERMINATOR', value => TRUE);
:c := dbms_metadata.fetch_clob(handle => l_handle);
dbms_metadata.close(l_handle);
end;
/
Так что теперь переменная c
держит DDL:
print c
C
---------------------------------------------
CREATE TABLE "ORDER"."T42" ("ID" NUMBER) ;
Вместо использования анонимного блока и переменной SQL * Plus вы можете превратить это в функцию, которая принимает тип объекта и имя объекта и возвращает DDL как CLOB.
Возможно, вы предпочитаете, чтобы не была указана какая-либо схема, что было бы более полезно, если это затем будет помещено в исходный элемент управления или может использоваться в других средах. Для этого просто введите null как новую схему:
dbms_metadata.set_remap_param(transform_handle => l_transform_handle,
name => 'REMAP_SCHEMA', old_value => USER, new_value => null);
C
-------------------------------------
CREATE TABLE "T42" ("ID" NUMBER) ;
Как вы получаете DDL с dbms_metadata? –
Да, используя metadata.get_DDL – Prabhu
'replace ('prabhu_order.', 'Order.')'? – Ben