2014-08-27 49 views
1

我在Oracle數據庫的開發環境中有一個架構。將架構名稱更改爲更高的環境

在我的開發環境中,我的模式名稱是prabhu_order。所以當我得到DDL來促進高層環境時,它會來到prabhu_order.table1,prabhu_order.table2 ...等

在我所有的高級環境中,它只是ORDER。

現在我正在做ctrl替換來更改模式名稱。我害怕這樣做,當我有50 ddls ...

請幫我一個方法來更改模式名稱!

+0

你怎麼得到的DDL,與dbms_metadata? – 2014-08-27 16:06:41

+0

是使用metadata.get_DDL – Prabhu 2014-08-27 16:13:34

+2

'replace('prabhu_order。','order。')'? – Ben 2014-08-27 16:23:52

回答

3

本的建議使用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返回。

您可能更喜歡根本不具有指定的模式,如果將要放入源代碼管理,或者可能在其他環境中使用,將會更有用。要做到這一點,只是通過空作爲新的架構,而不是:

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) ; 
+0

[此討論](https://community.oracle.com/thread/1008491)之外的其他任何方式可能都是我之前看過這種方法的地方。並且還顯示了功能版本。 – 2014-08-27 17:44:03

+0

非常感謝,Alex!同意鮑勃替換,但我正面臨着一些問題。那麼這有點冗長,但沒有風險,我覺得..再次感謝。 Stakeoverflow的確是一個學習和成長的平臺。保持良好的工作:-) – Prabhu 2014-08-28 08:42:50