powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поле DEFAULT значением
25 сообщений из 40, страница 1 из 2
Поле DEFAULT значением
    #32179631
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм... В Oracle 9i создаю таблицу, указываю для полей значения по умолчанию, например
CREATE TABLE TTest
(
F_ID number DEFAULT 0 NOT NULL,
F_TEXT DEFAULT ('') NOT NULL
)
Но при попытке выполнить команду
INSERT INTO TTest (F_ID) VALUES (12)
вылетает ORA-01400.
В чем дело? В MSSQL просто подставлялось значение по умолчанию для F_TEXT (пустая строка). То же самое не работает и для numer - полей...
???
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179641
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle treats empty string as NULL. So F_TEXT DEFAULT ('') NOT NULL is nothing more but F_TEXT DEFAULT NULL NOT NULL.

SY
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179643
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
'' для строки в оракле означает null, а поле имеет not null.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179668
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное правильно было бы

CREATE TABLE TTest
(
F_ID number DEFAULT 0 NOT NULL,
F_TEXT varchar2(50) DEFAULT ('') NOT NULL
)

А в том что То же самое не работает и для numer - полей... я сомневаюсь.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179678
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select length('') from dual;

LENGTH('')
 ----------
 
NULL

SQL> select length(NULL) from dual;

LENGTH(NULL)
 ------------
 
NULL
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179679
Finder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно. Empty=NULL. Спасибо.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179690
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многие ругают подход Оракла что пустая строка ''=NULL. Однако это не так уж плохо. Например в Аксесе, можно сказать для строки что нельзя нули но можно путсые строки или наоборот. Вот тогда начинаются приколы похлеще оракловых, если на это при дизайне завязываться!
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32179923
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сначала определился что такое пустая строка, а то ж можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> create table t (es varchar2( 2 ));

Tabelle wurde angelegt.

SQL> insert into t values(concat(CHR( 10 ), CHR( 13 )));

 1  Zeile wurde erstellt.

SQL> select * from t where es is not null;

ES
 --
 




 1  Zeile wurde ausgewählt.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180165
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сначала определился что такое пустая строка

Правильнее всего пустой строкой считать строку с количеством символов равным нулю. При этом имеют место те же неопределенности как

пустая строка = или <> пустая строка

а CHR(10), CHR(13) это символы форматирования как например пробел.

Определить пустую строку как строку не имеющую "значимых" символов повлекло бы за собой еще больше концептуальных и логических сложностей.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180218
Angel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Violina

А как же тогда select length('') from dual - ты же сама пример привела.
По-моему было бы лучше, если бы в подобных случаях возникало исключение (кстати и с BOOLEAN-переменными тоже, большой минус, по моему возможность написания что-то типа: IF ''>'....' THEN ... ELSE ... END IF;)
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180228
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Violina

> F_TEXT varchar2(50) DEFAULT ('') NOT NULL

Ну не знаю default null not null ???
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180229
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Angel

конечно правильнее было бы length('') = 0 но поскольку Оракл вообще не заморачивается на различие пустой строки и отсутствия данных, поэтому и выдается NULL в таком случае. Это не так страшно, просто вместо

where length(field) = 0

надо использовать

where field is null

PS
Это еще что, вот в Jbuilder есть такие понятия как assigned null и unassigned null, тогда совсем интересно становиться:-)
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180231
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Violina:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select length('') from dual;

LENGTH('')
 ----------
 
NULL

SQL> select length(NULL) from dual;

LENGTH(NULL)
 ------------
 
NULL


А чему ты собственно удивляешься? NULL - это неизвестно что. Естественно, что когда ты пытаешься определить "длинна(незвестно что)" - получишь тоже "неизвестно что". Или ты считаешь длинна "неизвестно что" должна быть = 0?

Тогда испозьзуй NVL - она для этого и предназначена.
Код: plaintext
1.
2.
3.
4.
5.
6.
SQLWKS> select  NVL(length(''), 0 ) from dual;
NVL(LENGTH
 ----------
 
          0 
 1  row selected.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180248
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to softbuilder

с NVL все выглядит вообще красиво. Пустая строка и NULL конечно очень похожи, но есть отличия. Например если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль. Но кака я уже сказала поскольку оракл отождествляет пустую строку с null, то логично что length('') = null.

to gluk

F_TEXT varchar2(50) DEFAULT ('') NOT NULL

Это был не совет а указание на ошибку в определении - отсутствовал тип данных

F_TEXT DEFAULT ('') NOT NULL
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180263
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Violina:

'Например если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль. "

Где определяется?
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180275
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements5a.htm#59112

Oracle currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180286
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это в будущем.
Ты мне приведи пример, где сейчас реально "...если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль..."
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180309
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль.

Во первых это конструкция если ... то , т.е. если пустая строка определяется как строка с нулевых количеством символов, то тот факт что количество символов у нее ноль вытекает из самого определения.

Тогда вопрос принимает вид, определяет ли Оракл пустую строку как строку с нулевых количеством символов. В Оракл явного определения empty string я пока не встречала, но это можно увидеть в приведенном мною тексте из доки

Oracle currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.

По моему из этого фрагмента текста очевидно что автор доки под понятиями a character value with a length of zero и empty strings подразумевает одно и тоже.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180314
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Где" - это из баз даных или "вообще"? Если второе, то не глядя скажу, что в Delphi, Java так и есть, могу еще потренироваться в VB проверку написать. Из баз данных за Sybase скажу, Interbase... Вообще ИМХО это только Oracle выпендрился с length('')=null.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180320
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov

Конечно может и выпендрился, но по крайней мере, Оракл последователен в своей концепции, раз уж пустая строка рассматривается как NULL тогда и все эффекты от нее должны быть как от NULL.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180331
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну уж это, пожалуй, не заслуга, а само собой разумеется, что так должно быть. Хотя я не совсем понимаю, почему конкатенация с NULL не дает NULL:

Код: plaintext
1.
2.
3.
4.
5.
dan@oraspb>; select null||'X' from dual;

N
-
X


По идее, если я хочу соединить пустую строку и непустую, то получу вполне предсказуемый вариант. Но почему именно в этой операции NULL ведет себя как пустая строка?
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180343
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis

Ну уж это, пожалуй, не заслуга, а само собой разумеется, что так должно быть.

Но тем не менее очень легко поддаться соблазну сделать какие отклонения ради удобства имплементации или использования.

С конкатенацией действительно, NULL ведет себя как пустая строка. То есть отклонения все таки имеют место.

По идее, если я хочу соединить пустую строку и непустую, то получу вполне предсказуемый вариант. Но почему именно в этой операции NULL ведет себя как пустая строка?

Мне пришло в голову такое объяснение. Если бы было иначе, не помогла бы даже всемогущая функция палочка выручалочка NVL. Например в запросе

select NVL(field, '') || 'X' from tbl;

'' интерпретировалась бы как NULL и конкатенация с пустыми строками была бы просто невозможна, разве что использование CASE.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180346
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov:
Да именно это я и хотел услышать, что так сделано например в Java.

Просто я хотел бы что-бы Violina не утверждала голословно а привела бы конкретный пример.

Потому-что, утверждение:
Код: plaintext
1.
2.
3.
Во первых это конструкция если ... то, т.е. если пустая строка определяется 
как строка с нулевых количеством символов, то тот факт что количество 
символов у нее ноль вытекает из самого определения


не может являться доказательным, потому-что нет никакого определения.
Можно говорить только о том, что соответствует это какому-либо стандарту или нет.
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180354
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to softbuilder

Утверждение

пустая строка определяется как строка с нулевых количеством символов

голословно.

если пустая строка определяется как строка с нулевых количеством символов, то тот факт что количество
символов у нее ноль вытекает из самого определения


нет.

или нужно доказывать что если пустая строка определяется как строка с нулевых количеством символов, то тот факт что количество
символов у нее ноль вытекает из самого определения?

Чем не достаточен был текст из доки?

Oracle currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.

Он объясняет

что empty string is a character value with a length of zero
почему length('') = NULL (потому что length('')=length(NULL))
...
Рейтинг: 0 / 0
Поле DEFAULT значением
    #32180379
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Violina:

Это всё детский лепет. Понятие пустая строка или не пустая строка, должно исходить не из исходя из понятия слов "пустой, строка" того или иного языка - русского, английского, с использованием словаря.

А определятся на основании стандартов, типа ANSI/IEEE и иных.

Не нужно обяснять на пальцах, если вы хотите что бы вас считали серьёзным программистом.
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поле DEFAULT значением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]