

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 準備更新時區檔案
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.preparing"></a>

時區檔案升級有兩個不同的階段：準備和升級。雖然並非必要，但強烈建議您執行準備步驟。於此步驟中，您可以找出將受執行 PL/SQL 程序 `DBMS_DST.FIND_AFFECTED_TABLES` 影響的資料。如需準備視窗的詳細資訊，請參閱 Oracle 資料庫文件中的[使用時區資料升級時區檔案和時間戳記](https://docs.oracle.com/en/database/oracle/oracle-database/19/nlspg/datetime-data-types-and-time-zone-support.html#GUID-B0ACDB2E-4B49-4EB4-B4CC-9260DAE1567A)。

**如要準備更新時區檔案**

1. 使用 SQL 用戶端連線至您的 Oracle 資料庫。

1. 決定目前使用的時區檔案版本。

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   ```

1. 決定您資料庫執行個體上可用的最新時區檔案版本。

   ```
   SELECT DBMS_DST.GET_LATEST_TIMEZONE_VERSION FROM DUAL;
   ```

1. 決定具有類型 `TIMESTAMP WITH LOCAL TIME ZONE` 或 `TIMESTAMP WITH TIME ZONE` 資料欄的資料表總大小。

   ```
   SELECT SUM(BYTES)/1024/1024/1024 "Total_size_w_TSTZ_columns_GB"
   FROM   DBA_SEGMENTS
   WHERE  SEGMENT_TYPE LIKE 'TABLE%'
   AND    (OWNER, SEGMENT_NAME) IN
            (SELECT OWNER, TABLE_NAME
             FROM   DBA_TAB_COLUMNS
             WHERE  DATA_TYPE LIKE 'TIMESTAMP%TIME ZONE');
   ```

1. 決定具有類型 `TIMESTAMP WITH LOCAL TIME ZONE` 或 `TIMESTAMP WITH TIME ZONE` 資料欄的區段名稱和大小。

   ```
   SELECT OWNER, SEGMENT_NAME, SUM(BYTES)/1024/1024/1024 "SEGMENT_SIZE_W_TSTZ_COLUMNS_GB"
   FROM   DBA_SEGMENTS
   WHERE  SEGMENT_TYPE LIKE 'TABLE%'
   AND    (OWNER, SEGMENT_NAME) IN
            (SELECT OWNER, TABLE_NAME
             FROM   DBA_TAB_COLUMNS
             WHERE  DATA_TYPE LIKE 'TIMESTAMP%TIME ZONE')
   GROUP BY OWNER, SEGMENT_NAME;
   ```

1. 執行準備步驟。
   + 程序 `DBMS_DST.CREATE_AFFECTED_TABLE` 會建立資料表，來儲存任何受影響的資料。您將此資料表的名稱傳遞給 `DBMS_DST.FIND_AFFECTED_TABLES` 程序。如需詳細資訊，請參閱 Oracle 資料庫文件中的 [CREATE\$1AFFECTED\$1TABLE 程序](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-C53BAABA-914A-404C-9CD5-823257BE0B00)。
   + 此程序 `CREATE_ERROR_TABLE` 會建立一個資料表來記錄錯誤。如需詳細資訊，請參閱 Oracle 資料庫文件中的 [CREATE\$1ERROR\$1TABLE 程序](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-6A7EA024-B02D-4486-B1D6-EF6ABF5DE507)。

   下列範例會建立受影響的資料和錯誤資料表，並找出所有受影響的資料表。

   ```
   EXEC DBMS_DST.CREATE_ERROR_TABLE('my_error_table')
   EXEC DBMS_DST.CREATE_AFFECTED_TABLE('my_affected_table')
   
   EXEC DBMS_DST.BEGIN_PREPARE(new_version);
   EXEC DBMS_DST.FIND_AFFECTED_TABLES('my_affected_table', TRUE, 'my_error_table');
   EXEC DBMS_DST.END_PREPARE;
   
   SELECT * FROM my_affected_table;
   SELECT * FROM my_error_table;
   ```

1. 查詢受影響和錯誤資料表。

   ```
   SELECT * FROM my_affected_table;
   SELECT * FROM my_error_table;
   ```