Oracle
 sql >> Database >  >> RDS >> Oracle

12c VARCHAR2(32767)

Mi sono sempre chiesto perché il tipo di dati VARCHAR2 fosse limitato a così pochi caratteri. Per la maggior parte degli attributi, non sono necessari più di 2.000 byte. Ricordo quando Oracle ha aumentato il limite da 2.000 byte a 4.000. Ma SQL Server 2008R2 ti consente di usarne 8.000. Stiamo parlando di dati di caratteri e il limite di 2.000 o 4.000 byte mi è sembrato un po' arbitrario. Ora in Oracle 12c puoi utilizzare VARCHAR2(32767) per un massimo di 32 KB. Ma prima di poter utilizzare questa nuova funzionalità, devi lavorare un po'. Immediatamente, riceverai un errore.

SQL> create table test_tab (val varchar2(32000));
create table test_tab (val varchar2(32000))
                                    *
ERROR at line 1:
ORA-00910: specified length too long for its datatype

Oracle 12c include un nuovo parametro, MAX_STRING_SIZE che controlla quanto può essere grande il tuo tipo di dati VARCHAR2. Questo parametro può essere impostato su STANDARD o ESTESO. L'impostazione predefinita è STANDARD che limita VARCHAR2 a 4000 byte. La modifica di questo parametro da standard a ESTESO è un viaggio di sola andata. Non puoi tornare indietro. Per apportare la modifica, è necessario AVVIARE l'AGGIORNAMENTO dell'istanza, modificare il parametro ed eseguire uno script.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup upgrade
ORACLE instance started.
Total System Global Area 1043886080 bytes
Fixed Size                  2296280 bytes
Variable Size             654313000 bytes
Database Buffers          381681664 bytes
Redo Buffers                5595136 bytes
Database mounted.
Database opened.
SQL> alter system set max_string_size=EXTENDED scope=both;
System altered.
SQL> @?/rdbms/admin/utl32k.sql

L'esecuzione dell'operazione potrebbe richiedere del tempo. Una volta terminato, rimbalza l'istanza per aprirla normalmente.

Ora posso creare una tabella con questo tipo di dati più grande.

SQL> create table test_tab (val varchar2(32000));
Table created.