如何在oracle中修改OBJECT TYPE TABLE的大小

时间:2018-06-15 07:30:42

标签: sql oracle plsql

我的Oracle数据库中有两种不同的对象类型。

一个是:

create or replace TYPE "PERSONTYPE"  as object (   
EmployerName varchar2(30))

我可以将EmployerName varchar2大小修改为:

ALTER TYPE EMPLOYERTYPE
MODIFY ATTRIBUTE (EmployerName varchar2(40))
CASCADE;

这很好。

另一个是:

create or replace TYPE "ITEMLIST"   as TABLE of varchar2(300);

我已经在桌子上有使用ITEMLIST的数据。现在,我想将varchar2(300)更改为varchar2(400)而不会丢失数据。在这种情况下如何改变"ITEMLIST"的大小?

1 个答案:

答案 0 :(得分:4)

  

我所说的是,ITEMLIST被用作我的嵌套对象   另一张桌子。该表会受到影响吗?

没有明显的ALTER命令。此外,您将不被允许修改定义,因为您有一个依赖对象。但另外,你可以解决。请参阅下面的演示,并附有内联说明。

--Type of varchar(300)
CREATE OR REPLACE TYPE ITEMLIST AS TABLE OF VARCHAR2(300);
/
--Table Created 
CREATE  TABLE tt (col ITEMLIST) 
nested table
col
STORE AS
col1;
/
--Record Inserted
INSERT INTO tt VALUES(ITEMLIST(1));
INSERT INTO tt VALUES(ITEMLIST(3));
INSERT INTO tt VALUES(ITEMLIST(4));
/
--Record Selected
SELECT * FROM tt;         
/
--Created type of Varchar2(400) --New Size
CREATE OR REPLACE TYPE NEW_ITEMLIST AS TABLE OF VARCHAR2(400);
/
--Alter table and added the new column with increased size
ALTER TABLE tt ADD (newcol NEW_ITEMLIST)  NESTED TABLE newcol STORE AS col2;
/
--Merged Records in Old column to new column.
MERGE INTO tt tb1
USING (SELECT * FROM tt) tb2
ON (tb1.col = tb2.col)
WHEN MATCHED THEN
UPDATE
SET tb1.newcol = CAST(tb2.col AS NEW_ITEMLIST) --You need to cast as the size differs even though the datatype remains same
WHERE tb1.col = tb2.col;    
/
COMMIT;
/
 --Drop old column of smaller size
ALTER TABLE tt DROP column COL;
/
--Again selected records to verify.
SELECT * FROM tt;
/