2016-02-04 5 views
1

У меня есть функция в PLSQL, которая работает со строками и возвращает тип VARCHAR2.Возможно ли создать динамическую переменную varchar2?

Одна из переменных в этой функции

result_key  VARCHAR2 (4000) := ''; 

Когда он работает с большим количеством данных, я получаю ORA-06502: PL/SQL: numeric or value error: character string buffer too small ошибку.

Похоже, что я должен расширить свою переменную result_key. Единственное решение, которое я вижу, это объявить result_key, как

result_key  VARCHAR2 (8000) := ''; 

Я хочу знать, могу ли я сделать это без объявления фиксированного размера result_key.

+0

С 11g R1 вы можете сделать переменные переменной 'varchar2'« динамическими », указав переменную с максимальной длиной:' varchar2 (32767) '. Подробнее см. Http://stackoverflow.com/q/24831972/272735. Однако 32767 байт является жестким пределом. Если ваши данные не соответствуют лимиту, вам нужно переключиться на 'clob'. – user272735

ответ

4

PL/SQL позволяет varchar2() типам иметь до 32,767 байт (см. here). Этого может быть достаточно для ваших целей. Обратите внимание, что предел для данных, хранящихся в таблицах Oracle, составляет 4000 (см. here). (По-моему, разные длины кажутся жестокой практической шуткой, хотя я понимаю основные причины.)

В общем, тип для более длинных строк - CLOB - символ больших двоичных объектов. Они ведут себя так же, как char/varchar, и их можно хранить в таблицах, а также в переменных PL/SQL. Единственным недостатком является то, что самый простой способ взглянуть на значение - скопировать их в varchar2() в PL/SQL.

2

Для переменных varchar2 в PL/SQL вы должны объявить свою длину. Обратите внимание, что его фактическая длина всегда является реальной, поскольку они используют только столько места, сколько им нужно. Например

result_key  VARCHAR2 (4000) := 'test'; 

будет иметь длину 4, а не 4000. Так что, если вы собираетесь использовать большие строки и не уверен, что их размер (но уверен, что они не попали в предел) - идти с максимум 32767, о котором Гордон уже упомянул. Но имейте в виду, что PL/SQL может обрабатывать больше строк, чем SQL (4000), поэтому будьте осторожны, пытаясь их смешать, например, вставляя переменные в таблицы. Если вы не уверены в их максимальном размере, и, возможно, они превысят это - перейдите к CLOB.

Но опять-таки при использовании CLOBS и скопировать их в varchar2, чтобы избежать ошибки вы уже знаете, всегда используйте dbms_lob.substr(), например:

dbms_lob.substr(clob_name, [limit], [offset]); 
dbms_lob.substr(clob_name, 4000, 1); 

в этом примере - извлечь первые 4000 символов из clob_name

Смежные вопросы