我知道我可以轻松地创建一个表的副本,create table t1 select * from table2;但我需要复制:
有办法按pl/sql程序办吗?我的 Oracle 版本是11R2。
表的SQL:
-- Create table
create table SCHEMA.MY_TABLE
(
id number(1),
name varchar2(30),
dat date
)
tablespace MY_TS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 10M
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table SCHEMA.MY_TABLE
is 'MY TABLE';
comment on column SCHEMA.MY_TABLE.ID
is 'id';
comment on column SCHEMA.MY_TABLE.NAME
is 'name of operation';
comment on column SCHEMA.MY_TABLE.DAT
is 'date of operation';
grant select on SCHEMA.MY_TABLE to PUBLIC;
Run Code Online (Sandbox Code Playgroud)
您可以使用DBMS_REDEFINITION包,那个东西可以复制整个表,包括注释等。它还会对新副本进行“碎片整理”以占用比原始表更少的空间。
更多信息请访问https://docs.oracle.com/database/121/ARPLS/d_redefi.htm#ARPLS042
请求示例:
因此,让我们创建一个测试模式、一个表并用一些数据填充它:
CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
GRANT UNLIMITED TABLESPACE TO "TEST_SCHEMA";
CREATE TABLE "TEST_SCHEMA"."NAMES" ("ID" NUMBER, "NAME" VARCHAR2(25), PRIMARY KEY("ID"));
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (1, 'joe');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (2, 'pete');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (3, 'mark');
Run Code Online (Sandbox Code Playgroud)
现在我们可以查看测试表的内容:
SELECT * FROM "TEST_SCHEMA"."NAMES";
Run Code Online (Sandbox Code Playgroud)
让我们通过创建与源表完全一样的空表来开始复制过程(使用WHERE 1=0,它不会接受任何数据)。
CREATE TABLE "TEST_SCHEMA"."NAMES_COPY" AS SELECT * FROM "TEST_SCHEMA"."NAMES" "A1" WHERE 1=0;
Run Code Online (Sandbox Code Playgroud)
在这里你可以设置并行化等,准备数据等。 一切都完成后,让我们开始重新定义过程:
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('TEST_SCHEMA','NAMES','NAMES_COPY');
END;
/
Run Code Online (Sandbox Code Playgroud)
复制内容时,我们需要复制依赖于表的每个对象(如触发器、索引等......)
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('TEST_SCHEMA', 'NAMES', 'NAMES_COPY',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/
Run Code Online (Sandbox Code Playgroud)
我们可以使用此查询检查在复制依赖项期间是否发生任何错误:
SELECT "OBJECT_NAME", "BASE_TABLE_NAME", "DDL_TXT" FROM DBA_REDEFINITION_ERRORS;
Run Code Online (Sandbox Code Playgroud)
如果一切正常,我们就可以完成这个过程:
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE ('TEST_SCHEMA', 'NAMES', 'NAMES_COPY');
END;
/
Run Code Online (Sandbox Code Playgroud)
瞧,新桌子就像克隆羊多莉,里面有所有东西:
SELECT * FROM "TEST_SCHEMA"."NAMES_COPY";
Run Code Online (Sandbox Code Playgroud)
现在要清理测试模式,请运行以下命令:
DROP TABLE "TEST_SCHEMA"."NAMES";
DROP TABLE "TEST_SCHEMA"."NAMES_COPY";
DROP USER "TEST_SCHEMA" CASCADE;
Run Code Online (Sandbox Code Playgroud)
我希望它有所帮助。
| 归档时间: |
|
| 查看次数: |
5418 次 |
| 最近记录: |