本篇内容介绍了“Oracle12.2怎么用对象数据类型来重定义表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Oracle 12.2使用对象数据类型来重定义表,下面的例子将重定义表将列改变为对象属性,原始表为customer,定义如下:

SQL>createtablejy.customer(2cidnumbernotnull,3namevarchar2(30),4streetvarchar2(100),5cityvarchar2(30),6statevarchar2(2),7zipnumber(5)8);TablecreatedSQL>altertablejy.customeraddconstraintcustomer_pkprimarykey(cid);Tablealtered

创建新的对象类型

SQL>createtypejy.addr_tasobject2(3streetvarchar2(100),4cityvarchar2(30),5statevarchar2(2),6zipnumber(5,0)7);89/Typecreated

联机重定义操作如下:
1.用要执行联机重定义操作的用户登录数据库

SQL>connjy/jy@jypdbConnected.

2.验证表是否可以执行联机重定义,可以使用主键或伪主键来执行验证操作。

SQL>begin2dbms_redefinition.can_redef_table(3uname=>'jy',4tname=>'customer',5options_flag=>DBMS_REDEFINITION.CONS_USE_PK);6end;7/PL/SQLproceduresuccessfullycompleted

3.创建中间表jy.int_customer

SQL>createtablejy.int_customer2(3cidnumber,4namevarchar2(30),5addraddr_t6);Tablecreated

4.因为customer是一个非常大的表,为了让下一步操作启用并行执行以下语句:

SQL>altersessionforceparalleldmlparallel4;SessionalteredSQL>altersessionforceparallelqueryparallel4;Sessionaltered

5.使用主键来执行重定义操作

SQL>begin2dbms_redefinition.start_redef_table(3uname=>'jy',4orig_table=>'customer',5int_table=>'int_customer',6col_mapping=>'cidcid,namename,7addr_t(street,city,state,zip)addr');8end;9/PL/SQLproceduresuccessfullycompleted

6.复制依赖对象

SQL>declare2num_errorspls_integer;3begin4dbms_redefinition.copy_table_dependents(5uname=>'jy',6orig_table=>'customer',7int_table=>'int_customer',8copy_indexes=>DBMS_REDEFINITION.CONS_ORIG_PARAMS,9copy_triggers=>TRUE,10copy_constraints=>TRUE,11copy_privileges=>TRUE,12ignore_errors=>FALSE,13num_errors=>num_errors,14copy_statistics=>TRUE);15end;16/PL/SQLproceduresuccessfullycompleted

7.可选操作同步中间表

SQL>begin2dbms_redefinition.sync_interim_table(3uname=>'jy',4orig_table=>'customer',5int_table=>'int_customer');6end;7/PL/SQLproceduresuccessfullycompleted

8.完成重定义操作

SQL>begin2dbms_redefinition.finish_redef_table(3uname=>'jy',4orig_table=>'customer',5int_table=>'int_customer');6end;7/PL/SQLproceduresuccessfullycompleted

SQL>selectdbms_metadata.get_ddl(object_type=>'TABLE',name=>'CUSTOMER',schema=>'JY')fromdual;DBMS_METADATA.GET_DDL(OBJECT_TYPE=>'TABLE',NAME=>'CUSTOMER',SCHEMA=>'JY')--------------------------------------------------------------------------------CREATETABLE"JY"."CUSTOMER"("CID"NUMBERNOTNULLENABLE,"NAME"VARCHAR2(30),"ADDR""JY"."ADDR_T",CONSTRAINT"CUSTOMER_PK"PRIMARYKEY("CID")USINGINDEXPCTFREE10INITRANS2MAXTRANS255COMPUTESTATISTICSSTORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULTFLASH_CACHEDEFAULTCELL_FLASH_CACHEDEFAULT)TABLESPACE"TEST"ENABLE)SEGMENTCREATIONIMMEDIATEPCTFREE10PCTUSED40INITRANS1MAXTRANS255NOCOMPRESSLOGGINGSTORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULTFLASH_CACHEDEFAULTCELL_FLASH_CACHEDEFAULT)TABLESPACE"TEST"1rowselected.

可以看到表jy.customer已经成功能联机重定义

9.等待任何查询中间表的语句执行完成后将其删除

SQL>descjy.customerNameTypeNullableDefaultComments---------------------------------------CIDNUMBERNAMEVARCHAR2(30)YADDRADDR_TYSQL>droptablejy.customerpurge;Tabledropped

到此重定义操作就完成了。

“Oracle12.2怎么用对象数据类型来重定义表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!