Почему SQLPLUS показывает пустые и нулевые CLOB как нулевые? - PullRequest
4 голосов
/ 27 января 2011

Кажется, что SQLPLUS показывает пустые и пустые строки для объектов CLOB так, как я этого не ожидал.

Попробуйте следующее в SQLPLUS (я использую сервер Oracle 10g). Создайте таблицу с CLOB и вставьте пустой, пустой клоб, и то, что я считаю пустой строкой:

create table tableA (field1 number, field2 clob);
insert into tableA values (1, null);
insert into tableA values (2, empty_clob());
insert into tableA values (3, '');

Хорошо, давайте сделаем несколько запросов, но сначала нам нужно указать SQLPLUS, чтобы мы показывали нули для нас:

set null {NULL}

Для следующего запроса я бы ожидал, что вернется только строка 1, но она возвращает 2:

select * from tableA where field2 is null;

field1   field 2
-----------------------
1        {NULL} 
3        {NULL} 

Хм, поэтому '' хранится как пустое значение в CLOB?

Хорошо, поэтому на основании этого результата я бы ожидал, что следующий запрос вернет все 3 строки, но покажет {NULL} только в строках 1 и 3. Однако я получаю этот результат:

select * from tableA;

field1   field 2
-----------------------
1        {NULL} 
2        {NULL} 
3        {NULL} 

Это сбивает с толку. Я думал, что было только 2 нуля, хотя я изначально ожидал 1. Так что здесь происходит? set null не работает для CLOB, и если да, что я должен использовать вместо этого?

Я на самом деле пытаюсь решить другую проблему с нулевыми значениями CLOB, но из-за этого запутанного поведения я некоторое время запускал кольца, поэтому я хотел бы понять это, прежде чем продолжить.

Заранее спасибо

Боз

Ответы [ 3 ]

8 голосов
/ 27 января 2011

Oracle не различает NULL и пустую строку. Это общеизвестное нарушение или SQL стандартов.

Это причина того, что тип строки по умолчанию VARCHAR2, а не VARCHAR.

Во всех выпущенных в настоящее время версиях они одинаковы, но VARCHAR не рекомендуется для использования. Это связано с тем, что VARCHAR должен различать NULL и пустую строку, а VARCHAR2, не описанный в стандартах, - нет.

3 голосов
/ 27 января 2011

Я думаю, что это связано с тем, как SQL * Plus обрабатывает пустые строки и нулевые значения.

empty_clob() создает не значение NULL, а CLOB нулевой длины.

Что подтверждается тем фактом, что строка 2 не возвращается, когда вы запрашиваете строки, у которых field2 равно нулю.

С помощью моего инструмента JDBC я могу выделить столбцы, которые являются нулевыми, другим цветом, и там строка с empty_clob () не подсвечивается, тогда как остальные два -.

Так что я бы сказал, что это неправильная обработка опции set null в SQL * Plus.Со следующим утверждением вы увидите разницу:

select field1, 
       nvl(field2, 'THIS IS NULL')
from tableA;

Для меня это отображает:

field1   field 2
-----------------------
1        THIS IS NULL 
2        
3        THIS IS NULL
2 голосов
/ 27 января 2011

Было бы интересно посмотреть, что на самом деле находится в строке 2. В действительности это может быть не равно нулю, так как согласно документации (см. Ниже) empty_clob () вернет инициализированное местоположение clob, которое не имеет данные (несколько непонятно по нулевой проблеме).

При выполнении операторов SQL в инструментах запросов SQL, хотя Oracle имеет тенденцию неявно преобразовывать CLOB в строки, которые обрезаются с произвольной длиной.

Назначение

EMPTY_BLOB и EMPTY_CLOB возвращают пустой локатор LOB, который можно использовать для инициализации переменной LOB или, в выражении INSERT или UPDATE, для инициализации столбца или атрибута LOB в EMPTY. ПУСТО означает, что большой объект инициализирован, но не заполнен данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...