Oracle Database 12cR1からVARCHAR2/NVARCHAR2/RAWの拡張が以下のように可能となっています。
VARCHAR2/NVARCHAR2(最大4000バイト)
RAW(最大2000バイト)
VARCHAR2/NVARCHAR2(最大32767バイト)
RAW(最大32767バイト)
パラメータ説明
初期化パラメータ: MAX_STRING_SIZE
| 項目 | 値 |
|---|---|
| パラメータ・タイプ | 文字列 |
| 構文 | MAX_STRING_SIZE = { STANDARD | EXTENDED } |
| デフォルト値 | STANDARD |
| Oracle RAC 適用 | 複数インスタンスには、同じ値を使用する必要がある。 |
| オンライン変更 | 不可 |
パラメータ値の説明
- STANDARD 通常のバイト数制限
- EXTENDED 拡張されたバイト数制限
変更手順
SQL*Plusにログイン後、以下のコマンドを実行します。
$ sqlplus / as sysdba
$ sqlplus / as sysdba
SQL> -- COMPATIBLE初期化パラメータが12.0.0.0以上であることを確認します。
SQL> show parameter COMPATIBLE
SQL>
SQL> -- データベースの停止
SQL> shutdown immediate
SQL>
SQL> -- UPGRADEモードでデータベースを起動します。
SQL> startup upgrade
SQL>
SQL> -- MAX_STRING_SIZEの設定をEXTENDEDに変更します。
SQL> alter system set MAX_STRING_SIZE='EXTENDED' SCOPE=BOTH;
SQL>
SQL> -- rdbms/admin/utl32k.sqlスクリプトを実行します。
SQL> @?/rdbms/admin/utl32k.sql
SQL>
SQL> -- データベースをNORMALモードで再起動します。
SQL> shutdown immediate
SQL> startup
SQL>
SQL> -- rdbms/admin/utlrp.sqlスクリプトを実行して、無効なオブジェクトを再コンパイルします。
SQL> @?/rdbms/admin/utlrp.sql
SQL>
制限事項
VIEWの最大サイズ列が増加しないことがあるようです
utl32k.sqlスクリプトによって、必要な場合に、VARCHAR2、NVARCHAR2およびRAW列の最大サイズが増やされます。
一部のビューのSQLのリライト方法が原因で、これらのビューのVARCHAR2、NVARCHAR2およびRAW列の最大サイズが増加しない場合があります。
Oracle(R) Databaseリファレンス 12c リリース1 (12.1)
B71292-05
https://docs.oracle.com/cd/E57425_01/121/REFRN/GUID-D424D23B-0933-425F-BC69-9C0E6724693C.htm
標準のバイト数を超える対象列に対するINDEXは作成できません
既にINDEXが作成されているテーブルの列を、標準のバイト数を超えて拡張しようとした場合はエラーとなります。
MAX_STRING_SIZEをEXTENDEDからSTANDARDに戻すことはできません
一度MAX_STRING_SIZEをEXTENDEDに設定し、タイプの拡張を行った場合元に戻すことはできません。
コメント
本機能はデータが通常の制限値を超える場合、LOB(ラージオブジェクト)に格納することで機能を実現しています。
機能自体は便利ではあるのですが、デフォルト値がSTANDARD(拡張しない)であることと、単純な拡張ではないため、バグや制限等のリスクを考えれば、使用が必須でない限り少なくとも12cR2までは使用をしないほうがよさそうです。
また、未検証かつ、マニュアルの注意書きや説明にはありませんが、DBLINKを使用して、STANDARDの設定となっているデータベースからEXTENDEDとなっているデータベースのデータを取得する場合にも制限がありそうです。4000バイトが制限のデータベースで4000バイトを超えるデータをDBLINKを通じて取得可能ではないように思われます。
データ保存の基本的な部分の変更なので、通常運用に加え、RMAN/DataPump等の機能検証をきっちり行った上で実装することを推奨いたします。
