将架构名称更改为更高的环境

时间:2014-08-27 15:51:31

标签: sql oracle plsql

我在Oracle数据库的开发环境中有一个架构。

在我的开发环境中,我的架构名称是prabhu_order。因此,当我获得ddl以促进上层环境时,它将以prabhu_order.table1,prabhu_order.table2 ......等形式出现

在我所有的高级环境中,它只是ORDER。

现在我正在进行ctrl替换以更改架构名称。当我有50 ddls时,我害怕这样做......

请告诉我更改架构名称的方法!

1 个答案:

答案 0 :(得分:3)

Ben建议使用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) ;

您可以将其转换为获取对象类型和对象名称并将DDL作为CLOB返回的函数,而不是使用匿名块和SQL * Plus变量。

您可能更喜欢根本没有指定架构,如果将其放入源代码管理中,或者可能在其他环境中使用,则会更有用。要做到这一点,只需将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) ;
相关问题