Oracle
Oracle SQL 使用 DBMS_metadata 創建表的副本
所以我正在嘗試使用
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>
那麼你需要做的就是輸入/然後瞧。請記住,它是一個很酷的工具,但仍處於測試階段,但對於大多數部分來說效果很好。