ALTER TYPE (structured) 陳述式
ALTER TYPE 陳述式用來新增或捨棄使用者定義結構化類型的屬性或方法規格。 也可以變更現有方法的內容。
呼叫
此陳述式可以內嵌在應用程式中,或透過使用動態 SQL 陳述式來發出。 它是可執行的陳述式,只有在 DYNAMICRULES 執行行為對套件有效時才能動態準備 (SQLSTATE 42509)。
授權
- 類型綱目的 ALTERIN 專用權
- 類型的 擁有者 ,如 SYSCAT.DATATYPES 型錄視圖的 OWNER 直欄中所記錄
- 對類型綱目的 SCHEMAADM 權限
- DBADM 權限
- 資料庫上的 CREATE_NOT_FENCED_ROUTINE 權限
- DBADM 權限
若要變更要隔離的方法,不需要其他權限或專用權。
語法
說明
- type-name
- 識別要變更的結構化類型。 它必須是型錄中定義的現有類型 (SQLSTATE 42704) ,且類型必須是結構化類型 (SQLSTATE 428DP)。 在動態 SQL 陳述式中,CURRENT SCHEMA 特別暫存器會用作不完整物件名稱的限定元。 在靜態 SQL 陳述式中,QUALIFIER 前置編譯 /bind 選項隱含地指定不完整物件名稱的限定元。
- ADD ATTRIBUTE
- 在現有結構化類型的最後一個屬性之後新增屬性。
- attribute-definition
- 定義結構化類型的屬性。
- 屬性名稱
- 指定屬性的名稱。 此名稱不能與此結構化類型的任何其他屬性 (包括繼承屬性) 或此結構化類型的任何子類型 (SQLSTATE 42711) 相同。
在述詞中用作關鍵字的名稱數已保留供系統使用,且不能用作 attribute-name (SQLSTATE 42939)。 名稱為 OME、ANY、ALL、NOT、AND、OR、ABETWEEN、NULL、LIKE、EXISTS、IN、UNIQUE、OVERLAPS、LIKE、MATCH 及比較運算子。
資料類型 1 - 指定屬性的資料類型。 它是 CREATE TABLE 下列出的其中一個資料類型,而不是 XML (SQLSTATE 42601)。 資料類型必須識別現有的資料類型 (SQLSTATE 42704)。 如果指定 data-type 但沒有指定綱目名稱,則會在 SQL 路徑上搜尋綱目來解析類型。 各種資料類型的說明在
CREATE TABLE
中提供。 如果屬性資料類型是參照類型,則參照的目標類型必須是存在的結構化類型 (SQLSTATE 42704)。為了防止在執行時期允許類型的實例直接或間接包含相同類型的另一個實例或其中一個子類型的類型定義,有一項限制是無法定義類型,使其其中一個屬性類型直接或間接使用本身 (SQLSTATE 428EP)。
字元及圖形字串資料類型不能指定 CODEUNITS32的字串單位。
lob-options - 指定與 LOB 類型 (或根據 LOB 類型的特殊類型) 相關聯的選項。 如需 lob-options 的詳細說明,請參閱
CREATE TABLE
。
- 指定屬性的名稱。 此名稱不能與此結構化類型的任何其他屬性 (包括繼承屬性) 或此結構化類型的任何子類型 (SQLSTATE 42711) 相同。
- 定義結構化類型的屬性。
- DROP ATTRIBUTE
- 捨棄現有結構化類型的屬性。
- 屬性名稱
- 屬性的名稱。 屬性必須以類型 (SQLSTATE 42703) 的屬性存在。
- RESTRICT
- 施行規則,如果使用 type-name 作為現有表格、視圖、直欄、巢狀內嵌在直欄類型內的屬性或索引延伸的類型,則無法捨棄任何屬性。
- 新增方法 方法規格
- 將方法規格新增至 type-name所識別的類型。 除非使用個別 CREATE METHOD 陳述式來提供方法主體,否則無法使用此方法。 如需 方法規格的相關資訊,請參閱
CREATE TYPE (結構化)
。 - ALTER method-identifier
- 唯一識別要變更的方法實例。 指定的方法不一定有現有的方法主體。 無法變更宣告為 LANGUAGE SQL 的方法 (SQLSTATE 42917)。
- 方法 ID
- METHOD method-name
- 識別特定方法,且只有在類型 type-name只有一個名稱為 method-name 的方法實例時才有效。 所識別的方法可以定義任意數目的參數。 如果類型沒有此名稱的方法,則會引發錯誤 (SQLSTATE 42704)。 如果該類型有多個方法實例,則會引發錯誤 (SQLSTATE 42725)。
- METHOD method-name (data-type
- 提供方法簽章,可唯一識別方法。 不使用方法解析演算法。
- 方法名稱
- 指定類型 type-name的方法名稱。 資料類型
- 值必須符合 CREATE TYPE 陳述式上指定的資料類型 (在對應位置中)。 資料類型的數目,以及資料類型的邏輯連結,用來識別特定的方法實例。
如果資料類型不完整,則會透過搜尋 SQL 路徑上的綱目來解析類型名稱。 這也適用於指定給 REFERENCE 類型的資料類型名稱。
不需要指定參數化資料類型的長度、精準度或小數位數。 相反地,可以編寫一組空的括弧,以指出在尋找資料類型相符項時將忽略這些屬性。
無法使用 FLOAT () (SQLSTATE 42601) ,因為參數值指出不同的資料類型 (REAL 或 DOUBLE)。
如果已編碼長度、精準度或小數位數,則值必須完全符合 CREATE TYPE 陳述式中指定的值。
A type of FLOAT(n) does not need to match the defined value for n, because 0 < n < 25 means REAL, and 24 < n < 54 means DOUBLE. 會根據類型是 REAL 還是 DOUBLE 來進行比對。
如果具名或隱含綱目中的類型不存在具有指定簽章的方法,則會引發錯誤 (SQLSTATE 42883)。
- SPECIFIC METHOD specific-name
- 使用在建立方法時指定或預設的名稱來識別特定方法。 在動態 SQL 陳述式中,CURRENT SCHEMA 特別暫存器會用作不完整物件名稱的限定元。 在靜態 SQL 陳述式中,QUALIFIER 前置編譯 /bind 選項隱含地指定不完整物件名稱的限定元。 specific-name 必須識別具名或隱含綱目中的特定方法實例; 否則會引發錯誤 (SQLSTATE 42704)。
方法-選項 - 指定要針對方法變更的選項。
- FENCED 或 NOT FENCED
- 指定是否將方法視為可在資料庫管理程式作業環境的處理程序或位址空間 (NOT FENCED) 中執行的安全方法,或不視為在資料庫管理程式作業環境或位址空間 (NOT FENCED) 中執行的安全方法。 大部分方法都有以 FENCED 或 NOT FENCED 執行的選項。
如果將方法變更為 FENCED ,則資料庫管理程式會將其內部資源 (例如,資料緩衝區) 與方法的存取隔離。 一般而言,以 FENCED 執行的方法不會像以 NOT FENCED 執行的類似方法一樣執行。
警告:對未適當編碼、檢閱及測試的方法使用 NOT FENCED 可能會危及 Db2® 資料庫的完整性。 Db2 資料庫會針對許多常見類型的意外失敗採取一些預防措施,但在使用 NOT FENCED 方法時無法保證完整完整性。無法將宣告為 NOT THREADSAFE 的方法變更為 NOT FENCED (SQLSTATE 42613)。
如果方法具有任何已定義 AS LOCATOR 的參數,且已使用 NO SQL 選項定義,則無法將方法變更為 FENCED (SQLSTATE 42613)。
無法變更 LANGUAGE OLE 方法的這個選項 (SQLSTATE 42849)。
- THREADSAFE 或 NOT THREADSAFE
- 指定是否將方法視為在與其他常式 (THREADSAFE) 相同的處理程序中執行的安全方法 (NOT THREADSAFE)。如果使用 OLE 以外的 LANGUAGE 定義方法:
- 如果方法定義為 THREADSAFE ,則資料庫管理程式可以在與其他常式相同的處理程序中呼叫該方法。 一般而言,如果要成為安全執行緒,方法不應使用任何廣域或靜態資料區。 大部分程式設計參照包括撰寫安全執行緒常式的討論。 FENCED 和 NOT FENCED 方法都可以是 THREADSAFE。 如果以 LANGUAGE OLE 定義方法,則無法指定 THREADSAFE (SQLSTATE 42613)。
- 如果方法定義為 NOT THREADSAFE ,則資料庫管理程式絕不會在與另一個常式相同的處理程序中呼叫該方法。 只有隔離方法可以是 NOT THREADSAFE (SQLSTATE 42613)。
- DROP method-identifier
- 唯一識別要捨棄的方法實例。 指定的方法不能有現有的方法主體 (SQLSTATE 428ER)。 在使用 ALTER TYPE DROP METHOD 之前,請先使用 DROP METHOD 陳述式來捨棄方法主體。 無法捨棄 CREATE TYPE 陳述式隱含產生的方法 (例如轉換元及觀察程式) (SQLSTATE 42917)。
- RESTRICT
- 指出限制指定的方法具有現有的方法主體。 在使用 ALTER TYPE DROP METHOD 之前,請先使用 DROP METHOD 陳述式來捨棄方法主體。
規則
- 在下列任一情況下,類型 type-name (SQLSTATE 55043) 不容許新增或捨棄屬性:
- 類型或其中一個子類型是現有表格或視圖的類型。
- 存在一個表格直欄,其類型直接或間接使用 type-name。 術語 直接使用 和 間接使用 在
結構化類型
中定義。 - 在索引延伸中使用類型或其中一個子類型。
- 無法透過新增屬性來變更類型,以便該類型或其任何子類型的屬性總數超出 4082 (SQLSTATE 54050)。
- ADD ATTRIBUTE 選項:
- ADD ATTRIBUTE 會為新屬性產生觀察程式及轉換元方法。 這些方法類似於建立結構化類型時所產生的方法 (請參閱
CREATE TYPE (結構化)
)。 如果這些方法與任何現存方法或函數相衝突或置換,則 ALTER TYPE 陳述式會失敗 (SQLSTATE 42745)。 - 如果使用者明確指定類型 (或其任何子類型) 的 INLINE LENGTH ,且其值小於 292 ,則新增的屬性會導致指定的行內長度小於已變更類型之建構子函數的結果大小 (32 個位元組加上每個屬性 10 個位元組) ,則會產生錯誤 (SQLSTATE 42611)。
- ADD ATTRIBUTE 會為新屬性產生觀察程式及轉換元方法。 這些方法類似於建立結構化類型時所產生的方法 (請參閱
- DROP ATTRIBUTE 選項:
- 無法捨棄繼承自現有超類型的屬性 (SQLSTATE 428DJ)。
- DROP ATTRIBUTE 會捨棄已捨棄屬性的轉換元和觀察程式方法,並檢查那些已捨棄方法的相依關係。
- DROP METHOD 選項:
- 無法捨棄其他方法所置換的原始方法 (SQLSTATE 42893)。
注意事項
- 無法變更 SYSIBM、SYSFUN 或 SYSPROC 綱目中的方法 (SQLSTATE 42832)。
- 當透過新增或捨棄屬性來變更類型時,根據使用此類型或此類型子類型作為參數或結果的函數或方法,所有套件都會失效。
- 在結構化類型中新增或捨棄屬性時:
- 如果建立類型時系統已計算類型的 INLINE LENGTH ,則會自動修改已變更類型的 INLINE LENGTH 值,以及其所有子類型以考量變更。 INLINE LENGTH 值也會針對所有結構化類型自動 (遞迴地) 修改,其中 INLINE LENGTH 是由系統計算,且類型包括具有已變更 INLINE LENGTH 之任何類型的屬性。
- 如果使用者明確指定受新增或捨棄屬性影響之任何類型的 INLINE LENGTH ,則該特定類型的 INLINE LENGTH 不會變更。 必須特別注意明確指定的行內長度。 如果類型稍後可能會新增屬性,則對於該類型或直欄定義中其中一個子類型的任何用途,行內長度應該足夠大,以考量實例化物件的可能長度增加。
- 如果要讓新的屬性對應用程式可見,則必須修改現有的轉換函數,以符合資料類型的新結構。
- 在分割的資料庫環境中,不支援在外部使用者定義函數或方法中使用 SQL (SQLSTATE 42997)。
- 專用權: 在使用 CREATE METHOD 陳述式定義方法主體之前,不會針對 ALTER TYPE 陳述式中明確指定的任何方法提供 EXECUTE 專用權。 使用者定義類型的 擁有者 能夠使用 ALTER TYPE 陳述式來捨棄方法規格。
範例
- 範例 1: ALTER TYPE 陳述式可用來允許相互參照類型及表格的循環。 請考量名稱為 EMPLOYEE 及 DEPARTMENT 的相互參照表格。
下列順序將容許建立類型及表格。
CREATE TYPE DEPT ... CREATE TYPE EMP ... (including attribute named DEPTREF of type REF(DEPT)) ALTER TYPE DEPT ADD ATTRIBUTE MANAGER REF(EMP) CREATE TABLE DEPARTMENT OF DEPT ... CREATE TABLE EMPLOYEE OF EMP (DEPTREF WITH OPTIONS SCOPE DEPARTMENT) ALTER TABLE DEPARTMENT ALTER COLUMN MANAGER ADD SCOPE EMPLOYEE下列順序將容許捨棄這些表格及類型。
DROP TABLE EMPLOYEE (the MANAGER column in DEPARTMENT becomes unscoped) DROP TABLE DEPARTMENT ALTER TYPE DEPT DROP ATTRIBUTE MANAGER DROP TYPE EMP DROP TYPE DEPT - 範例 2: ALTER TYPE 陳述式可用來建立具有參照子類型之屬性的類型。
CREATE TYPE EMP ... CREATE TYPE MGR UNDER EMP ... ALTER TYPE EMP ADD ATTRIBUTE MANAGER REF(MGR) - 範例 3: ALTER TYPE 陳述式可用來新增屬性。 下列陳述式會將 SPECIAL 屬性新增至 EMP 類型。 因為未在原始 CREATE TYPE 陳述式上指定行內長度,所以會透過新增 13 (10 個位元組代表新屬性 + 屬性長度 + 2 個位元組代表非 LOB 屬性) 來重新計算行內長度。
ALTER TYPE EMP ... ADD ATTRIBUTE SPECIAL CHAR(1) - 範例 4: ALTER TYPE 陳述式可用來新增與類型相關聯的方法。 下列陳述式新增稱為 BONUS 的方法。
ALTER TYPE EMP ... ADD METHOD BONUS (RATE DOUBLE) RETURNS INTEGER LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC請注意,在發出 CREATE METHOD 陳述式以建立方法主體之前,無法使用 BONUS 方法。 如果假設類型 EMP 包括稱為 SALARY 的屬性,則下列範例會顯示方法主體定義。
CREATE METHOD BONUS(RATE DOUBLE) FOR EMP RETURN CAST(SELF.SALARY * RATE AS INTEGER)
