¿Cuál es el tamaño máximo de VARCHAR2 en PL / SQL y SQL?

Estoy en Oracle 10g. En un requisito, necesito boost el tamaño de una variable varchar2 de pl / sql. Ya está a 4000 tamaño. He leído que "en PL / SQL, VARCHAR2 puede tener hasta 32767 bytes. Para SQL, el límite es 4000 bytes"

¿Puedo boost el tamaño de esta variable sin preocuparme por el límite de SQL?

Consulte la documentation oficial ( http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i54330 )

Cadena de caracteres de longitud variable que tiene un tamaño máximo de longitud de bytes o caracteres. El tamaño máximo es 4000 bytes o caracteres, y el mínimo es 1 byte o 1 carácter. Debe especificar el tamaño para VARCHAR2. BYTE indica que la columna tendrá una semántica de longitud de bytes; CHAR indica que la columna tendrá semántica de caracteres.

Pero en Oracle Databast 12c tal vez 32767 ( http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020 )

Cadena de caracteres de longitud variable que tiene un tamaño máximo de longitud de bytes o caracteres. Debe especificar el tamaño para VARCHAR2. El tamaño mínimo es de 1 byte o 1 personaje. El tamaño máximo es: 32767 bytes o caracteres si MAX_STRING_SIZE = EXTENDIDO 4000 bytes o caracteres si MAX_STRING_SIZE = ESTÁNDAR

Si usa la encoding UTF-8, entonces un carácter puede tomar varios bytes (2 – 4). Para PL / SQL, el límite varchar2 es 32767 bytes, no caracteres. Vea cómo aumento una variable varchar2 PL / SQL del tamaño de 4000 caracteres:

SQL> set serveroutput on SQL> l 1 declare 2 l_var varchar2(30000); 3 begin 4 l_var := rpad('A', 4000); 5 dbms_output.put_line(length(l_var)); 6 l_var := l_var || rpad('B', 10000); 7 dbms_output.put_line(length(l_var)); 8* end; SQL> / 4000 14000 PL/SQL procedure successfully completed. 

Pero no puede insert en su tabla el valor de dicha variable:

 SQL> ed Wrote file afiedt.buf 1 create table ttt ( 2 col1 varchar2(2000 char) 3* ) SQL> / Table created. SQL> ed Wrote file afiedt.buf 1 declare 2 l_var varchar2(30000); 3 begin 4 l_var := rpad('A', 4000); 5 dbms_output.put_line(length(l_var)); 6 l_var := l_var || rpad('B', 10000); 7 dbms_output.put_line(length(l_var)); 8 insert into ttt values (l_var); 9* end; SQL> / 4000 14000 declare * ERROR at line 1: ORA-01461: can bind a LONG value only for insert into a LONG column ORA-06512: at line 8 

Como solución, puede intentar dividir el valor de este valor en varias partes ( SUBSTR ) y almacenarlas por separado

Según el enlace de documentation oficial compartido por Andre Kirpitch, Oracle 10g ofrece un tamaño máximo de 4000 bytes o caracteres para varchar2. Si está utilizando una versión superior de Oracle (por ejemplo Oracle 12c), puede get un tamaño máximo de hasta 32767 bytes o caracteres para varchar2. Para utilizar la function de tipo de datos ampliados de Oracle 12, debe iniciar Oracle en el modo de actualización. Siga los pasos a continuación en el símbolo del sistema:

1) Login as sysdba (sqlplus / as sysdba)

2) SHUTDOWN IMMEDIATE;

3) STARTUP UPGRADE;

4) ALTER SYSTEM SET max_string_size=extended;

5) Oracle\product\12.1.0.2\rdbms\admin\utl32k.sql

6) SHUTDOWN IMMEDIATE;

7) STARTUP;

No estoy seguro de lo que quería decir con "¿Puedo boost el tamaño de esta variable sin preocuparme por el límite de SQL?". Siempre que no intente insert más de 4000 VARCHAR2 en una columna VARCHAR2 SQL, no hay nada de qué preocuparse.

Aquí está la reference exacta (esto es 11g pero también es cierto para 10g)

http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/datatypes.htm

Tamaño máximo de VARCHAR2 en PL / SQL: 32.767 bytes Tamaño máximo en SQL 4.000 bytes