本篇内容介绍了“Oracle12.2怎么用对象数据类型来重定义表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
Oracle 12.2使用对象数据类型来重定义表,下面的例子将重定义表将列改变为对象属性,原始表为customer,定义如下:
sql> create table jy.customer( 2 cid number not null, 3 name varchar2(30), 4 street varchar2(100), 5 city varchar2(30), 6 state varchar2(2), 7 zip number(5) 8 ); Table created sql> alter table jy.customer add constraint customer_pk primary key(cid); Table altered
创建新的对象类型
sql> create type jy.addr_t as object 2 ( 3 street varchar2(100), 4 city varchar2(30), 5 state varchar2(2), 6 zip number(5,0) 7 ); 8 9 / Type created
联机重定义操作如下:
1.用要执行联机重定义操作的用户登录数据库
sql> conn jy/jy@jypdb Connected.
2.验证表是否可以执行联机重定义,可以使用主键或伪主键来执行验证操作。
sql> begin 2 dbms_redeFinition.can_redef_table( 3 uname => 'jy', 4 tname =>'customer', 5 options_flag => DBMS_REDEFinitioN.CONS_USE_PK); 6 end; 7 / PL/sql procedure successfully completed
3.创建中间表jy.int_customer
sql> create table jy.int_customer 2 ( 3 cid number, 4 name varchar2(30), 5 addr addr_t 6 ); Table created
4.因为customer是一个非常大的表,为了让下一步操作启用并行执行以下语句:
sql> alter session force parallel dml parallel 4; Session altered sql> alter session force parallel query parallel 4; Session altered
5.使用主键来执行重定义操作
sql> begin 2 dbms_redeFinition.start_redef_table( 3 uname => 'jy', 4 orig_table => 'customer', 5 int_table => 'int_customer', 6 col_mapping => 'cid cid, name name, 7 addr_t(street, city, state, zip) addr'); 8 end; 9 / PL/sql procedure successfully completed
6.复制依赖对象
sql> declare 2 num_errors pls_integer; 3 begin 4 dbms_redeFinition.copy_table_dependents( 5 uname => 'jy', 6 orig_table => 'customer', 7 int_table => 'int_customer', 8 copy_indexes => DBMS_REDEFinitioN.CONS_ORIG_ParaMS, 9 copy_triggers => TRUE, 10 copy_constraints => TRUE, 11 copy_privileges => TRUE, 12 ignore_errors => FALSE, 13 num_errors => num_errors, 14 copy_statistics => TRUE); 15 end; 16 / PL/sql procedure successfully completed
7.可选操作同步中间表
sql> begin 2 dbms_redeFinition.sync_interim_table( 3 uname => 'jy', 4 orig_table => 'customer', 5 int_table => 'int_customer'); 6 end; 7 / PL/sql procedure successfully completed
8.完成重定义操作
sql> begin 2 dbms_redeFinition.finish_redef_table( 3 uname => 'jy', 4 orig_table => 'customer', 5 int_table => 'int_customer'); 6 end; 7 / PL/sql procedure successfully completed
sql> select dbms_Metadata.get_ddl(object_type =>'TABLE',name =>'CUSTOMER',schema => 'JY') from dual; DBMS_MetaDATA.GET_DDL(OBJECT_TYPE=>'TABLE',NAME=>'CUSTOMER',SCHEMA=>'JY') -------------------------------------------------------------------------------- CREATE TABLE "JY"."CUSTOMER" ( "CID" NUMBER NOT NULL ENABLE, "NAME" VARCHAR2(30), "ADDR" "JY"."ADDR_T" , CONSTRAINT "CUSTOMER_PK" PRIMARY KEY ("CID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COmpuTE STATISTICS 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 "TEST" ENABLE ) 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 "TEST" 1 row selected.
可以看到表jy.customer已经成功能联机重定义
sql> desc jy.customer Name Type Nullable Default Comments ---- ------------ -------- ------- -------- CID NUMBER NAME VARCHAR2(30) Y ADDR ADDR_T Y sql> drop table jy.customer purge; Table dropped
到此重定义操作就完成了。
“Oracle12.2怎么用对象数据类型来重定义表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程之家网站,小编将为大家输出更多高质量的实用文章!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。