共计 3464 个字符,预计需要花费 9 分钟才能阅读完成。
本篇内容介绍了“Oracle12.2 怎么用对象数据类型来重定义表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
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 已经成功能联机重定义
9. 等待任何查询中间表的语句执行完成后将其删除
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 怎么用对象数据类型来重定义表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!
正文完