/*
DB2 8.2 在 ALTER TABLE COLUMN 上的功能很陽春。
它只能變更 VARCHAR 欄位的長度,對其他型態的異動是完全無能為力的。
DB2 9 雖然有改進,可是卻必須在變更後對 TABLE 做 REORG,
(除了 VARCHAR 及 VARGRAPHIC 之外)
DB2 9 型態的轉換只要不是型態完全不相關,
只要注意長度不要小於原先的長度,大致上都還能做變更
SQL Reference Volumne 2 有表列
*/
/* DB2 8.2 只有對 VARCHAR ALTER 時是 okay 的*/
CREATE TABLE TEST
(
COL1 VARCHAR(5),
COL2 CHAR(1)
) IN USERSPACE1;
ALTER TABLE TEST ALTER COLUMN COL1 SET DATA TYPE VARCHAR(10)
DB20000I SQL 指令已順利完成。
ALTER TABLE TEST ALTER COLUMN COL2 SET DATA TYPE CHAR(3)
DB21034E 命令被當作 SQL 陳述式處理, 因為它不是有效的「命令行處理器」命令。在SQL 處理程序期間,它已傳回:
SQL0190N ALTER TABLE "DB2ADMIN.TEST" 為 "COL2" 直欄指定的屬性與現存直欄不相容。 SQLSTATE=42837
/* DB2 9 */
/* create 測試 table */
create table altering_tab
(
col1 smallint,
col2 char(1),
col3 varchar(10),
col4 decimal(10,2)
) in userspace1
DB20000I SQL 指令已順利完成。
/* 新增測試資料 */
insert into altering_tab values (1,'A','A123456789',20.6),
(2,'B','B123456789',120.9),
(18,'C','C123456789',99.99),
(200,'G','G123456789',100.65)
DB20000I SQL 指令已順利完成。
/* 將 col1 型態變更為 integer */
alter table altering_tab alter column col1 set data type integer
DB20000I SQL 指令已順利完成。
/* 可以對 table 做 select */
select * from altering_tab
COL1 COL2 COL3 COL4
----------- ---- ---------- ------------
1 A A123456789 20.60
2 B B123456789 120.90
18 C C123456789 99.99
200 G G123456789 100.65
已選取 4 個記錄。
/* 但無法做 DML */
insert into altering_tab values (7100,'X','X123456789',999.98)
DB21034E 指令被當作 SQL 陳述式處理,因為他不是有效的「指令行處理器」指令。 在SQL 處理程序期間,他已傳回:
SQL0668N 表格 "ORION.ALTERING_TAB" 上不容許作業,原因碼為 "7"。SQLSTATE=57016
/* 須要做 REORG */
reorg table altering_tab
DB20000I REORG 指令已順利完成。
/* 之後才能對 TABLE 做 DML */
insert into altering_tab values (7100,'X','X123456789',999.98)
DB20000I SQL 指令已順利完成。
/* 變更 VARCHAR 欄位則無須做 REORG */
alter table altering_tab alter column col3 set data type varchar(16)
DB20000I SQL 指令已順利完成。
insert into altering_tab values (9999,'Y','Y123456789012345',1259.77)
DB20000I SQL 指令已順利完成。
/* 另外須要做 REORG 的還有 DROP 欄位的時候 */
alter table altering_tab drop column col4
DB20000I SQL 指令已順利完成。
insert into altering_tab values (333,'K','K555')
DB21034E 指令被當作 SQL 陳述式處理,因為他不是有效的「指令行處理器」指令。 在SQL 處理程序期間,他已傳回:
SQL0668N 表格 "ORION.ALTERING_TAB" 上不容許作業,原因碼為 "7"。SQLSTATE=57016
reorg table altering_tab
DB20000I REORG 指令已順利完成。
insert into altering_tab values (333,'K','K555')
DB20000I SQL 指令已順利完成。