Подтвердить что ты не робот

Каков максимальный размер VARCHAR2 в PL/SQL и SQL?

Я нахожусь в Oracle 10g. В требовании мне нужно увеличить размер переменной pl/sql varchar2. Он уже размером 4000. Я прочитал, что "в PL/SQL VARCHAR2 может быть до 32767 байт. Для SQL ограничение составляет 4000 байтов"

Можно ли увеличить размер этой переменной, не беспокоясь о пределе SQL?

4b9b3361

Ответ 1

См. официальную документацию (http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i54330)

Символьная строка переменной длины с байтами или символами максимальной длины. Максимальный размер - 4000 байтов или символов, а минимальный - 1 байт или 1 символ. Вы должны указать размер для VARCHAR2. BYTE указывает, что столбец будет иметь семантику длины байта; CHAR указывает, что столбец будет иметь семантику символов.

Но в Oracle Databast 12c возможно 32767 (http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020)

Символьная строка переменной длины с байтами или символами максимальной длины. Вы должны указать размер для VARCHAR2. Минимальный размер - 1 байт или 1 символ. Максимальный размер: 32767 байтов или символов, если MAX_STRING_SIZE = EXTENDED 4000 байтов или символов, если MAX_STRING_SIZE = STANDARD

Ответ 2

Если вы используете кодировку UTF-8, тогда один characher может принимать различное количество байтов (2 - 4). Для PL/SQL предел varchar2 равен 32767 байтам, а не символам. Посмотрите, как я увеличиваю переменную varchar2 PL/SQL размером 4000 символов:

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.

Но вы не можете вставить в таблицу значение такой переменной:

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

В качестве решения вы можете попытаться разделить это значение на несколько частей (SUBSTR) и сохранить их отдельно

Ответ 3

Согласно официальной ссылке на документацию, совместно используемой Андре Кирпичем, Oracle 10g дает максимальный размер 4000 байтов или символов для varchar2. Если вы используете более высокую версию oracle (например, Oracle 12c), вы можете получить максимальный размер до 32767 байт или символов для varchar2. Чтобы использовать расширенный тип данных оракула 12, вам нужно запустить оракул в режиме обновления. Выполните следующие шаги в командной строке:

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;

Ответ 4

Не уверен, что вы имели ввиду с "Могу ли я увеличить размер этой переменной, не беспокоясь о пределе SQL?". До тех пор, пока вы не попытаетесь вставить более 4000 VARCHAR2 в столбец VARCHAR2 SQL, вам не о чем беспокоиться.

Вот точная ссылка (это 11g, но верно и для 10g)

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

VARCHAR2 Максимальный размер в PL/SQL: 32,767 байта Максимальный размер в SQL 4 000 байт