2008年9月18日 星期四

"Alter Table" a bit change - DB2 9


/*
  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 指令已順利完成。