我的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"
的大小?
答案 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;
/