web-dev-qa-db-fra.com

Quelle est la taille maximale de VARCHAR2 en PL / SQL et SQL?

Je suis sur Oracle 10g. Dans une exigence, je dois augmenter la taille d'une variable VARCHAR2 pl/sql. Il est déjà à la taille 4000. Je ai l que

en PL/SQL, VARCHAR2 peut contenir jusqu'à 32 767 octets. Pour SQL, la limite est de 4000 octets.

Puis-je augmenter la taille de cette variable sans me soucier de la limite SQL?

29
Ajay Gupta

Voir la documentation officielle ( http://docs.Oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i543 )

Chaîne de caractères de longueur variable ayant des octets ou des caractères de taille maximale. La taille maximale est de 4000 octets ou caractères, et la taille minimale est de 1 octet ou 1 caractère. Vous devez spécifier la taille de VARCHAR2. BYTE indique que la colonne aura une sémantique de longueur en octets; CHAR indique que la colonne aura une sémantique de caractère.

Mais dans Oracle Databast 12c, peut-être 32767 ( http://docs.Oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF3002 )

Chaîne de caractères de longueur variable ayant des octets ou des caractères de taille maximale. Vous devez spécifier la taille de VARCHAR2. La taille minimale est de 1 octet ou 1 caractère. La taille maximale est: 32 767 octets ou caractères si MAX_STRING_SIZE = EXTENDED 4000 octets ou caractères si MAX_STRING_SIZE = STANDARD

27
Andre Kirpitch

Si vous utilisez le codage UTF-8, un caractère peut prendre un nombre d'octets différent (2 à 4). Pour PL/SQL, la limite de varchar2 est de 32 767 octets, pas de caractères. Voyez comment j'augmente une variable PL/SQL varchar2 de la taille de 4000 caractères:

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.

Mais vous ne pouvez pas insérer dans votre table la valeur de cette 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

En guise de solution, vous pouvez essayer de scinder la valeur de cette variable en plusieurs parties ( SUBSTR ) et de les stocker séparément.

8
zaratustra

Selon le lien de documentation officiel partagé par Andre Kirpitch, Oracle 10g donne une taille maximale de 4000 octets ou caractères pour varchar2. Si vous utilisez une version supérieure d'Oracle (par exemple Oracle 12c), vous pouvez obtenir une taille maximale de 32 767 octets ou caractères pour varchar2. Pour utiliser la fonctionnalité de type de données étendu d'Oracle 12, vous devez démarrer Oracle en mode de mise à niveau. Suivez les étapes ci-dessous dans l'invite de commande:

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;

sept) STARTUP;

5
Ashwath Padmashali

Vous ne savez pas ce que vous vouliez dire par "Puis-je augmenter la taille de cette variable sans me soucier de la limite SQL?". Tant que vous n'essayez pas d'insérer plus de 4000 VARCHAR2 dans une colonne SQL VARCHAR2, vous n'avez rien à craindre.

Voici la référence exacte (c'est 11g mais c'est vrai aussi pour 10g)

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

VARCHAR2 Taille maximale en PL/SQL: 32 767 octets Taille maximale en SQL 4 000 octets

1
hol