Oracle

Oracle SQL 使用 DBMS_metadata 創建表的副本

  • February 26, 2015

所以我正在嘗試使用dbms_metadata. 我知道您可以通過執行獲得表的 DDL,DBMS_METADATA.get_DDL('Table','TABLENAME')所以我現在的問題是如何使用它來創建一個新的相同表?

我知道你可以很容易地用 etc 創建一個表的副本create table t1 select * from table2;。那麼我怎樣才能利用 dbms_metadata 來創建一個新的相同的表呢?任何建議將不勝感激。謝謝!

您可以使用元數據 API 來執行此操作,而不是簡單地使用基於文本的替換,這是一種更強大的解決方案。假設您有一個表 X.TABLE1:

create table x.table1 (id number, name varchar2(100), primary key(id));

您想將其重新創建為 Y.TABLE2,您可以執行以下操作:

set serveroutput on
declare
 metadata_handle number;
 transform_handle number;
 ddl_handle number;
 result_array sys.ku$_ddls;
begin
 metadata_handle := dbms_metadata.open('TABLE');
 transform_handle := dbms_metadata.add_transform(metadata_handle, 'MODIFY');
 dbms_metadata.set_remap_param(transform_handle, 'REMAP_NAME', 'TABLE1', 'TABLE2');
 dbms_metadata.set_remap_param(transform_handle, 'REMAP_SCHEMA', 'X', 'Y');

 ddl_handle := dbms_metadata.add_transform(metadata_handle, 'DDL');

 dbms_metadata.set_filter(metadata_handle, 'SCHEMA', 'X');
 dbms_metadata.set_filter(metadata_handle, 'NAME', 'TABLE1');

 loop
   result_array := dbms_metadata.fetch_ddl(metadata_handle);
   exit when result_array is null;
     for i in result_array.first..result_array.last loop
     dbms_output.put_line(result_array(i).ddltext);
   end loop;
 end loop; 
 dbms_metadata.close(metadata_handle);
end;
/

結果是:

CREATE TABLE "Y"."TABLE2" 
  (    "ID" NUMBER, 
   "NAME" VARCHAR2(100), 
    PRIMARY KEY ("ID")
 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
 TABLESPACE "USERS"  ENABLE
  ) SEGMENT CREATION DEFERRED 
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING
 TABLESPACE "USERS" 

顯然,您可以將其傳遞給execute immediate,或者只是假離線。

如果您想要更多自動化,請下載SQLcl,然後您可以做一些有趣的事情,例如

ctas current_table new_table

它會為您生成必要的程式碼。例如,

SQL> ctas my_table new_table
 CREATE TABLE OWNER."NEW_TABLE"
  (    "OWNER",
       "OBJECT_NAME",
       "SUBOBJECT_NAME",
       "OBJECT_ID",
       "DATA_OBJECT_ID",
       "OBJECT_TYPE",
       "CREATED",
       "LAST_DDL_TIME",
       "TIMESTAMP",
       "STATUS",
       "TEMPORARY",
       "GENERATED",
       "SECONDARY",
       "NAMESPACE",
       "EDITION_NAME",
       "SHARING",
       "EDITIONABLE",
       "ORACLE_MAINTAINED"
  ) SEGMENT CREATION IMMEDIATE
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
 TABLESPACE "USERS"
SQL>

那麼你需要做的就是輸入/然後瞧。請記住,它是一個很酷的工具,但仍處於測試階段,但對於大多數部分來說效果很好。

引用自:https://dba.stackexchange.com/questions/93826