|
|
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Гм... В 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 - полей... ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:04:50 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Oracle treats empty string as NULL. So F_TEXT DEFAULT ('') NOT NULL is nothing more but F_TEXT DEFAULT NULL NOT NULL. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:07:27 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
'' для строки в оракле означает null, а поле имеет not null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:07:34 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Наверное правильно было бы CREATE TABLE TTest ( F_ID number DEFAULT 0 NOT NULL, F_TEXT varchar2(50) DEFAULT ('') NOT NULL ) А в том что То же самое не работает и для numer - полей... я сомневаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:23:27 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Интересно, что Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:29:24 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Понятно. Empty=NULL. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:29:26 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Многие ругают подход Оракла что пустая строка ''=NULL. Однако это не так уж плохо. Например в Аксесе, можно сказать для строки что нельзя нули но можно путсые строки или наоборот. Вот тогда начинаются приколы похлеще оракловых, если на это при дизайне завязываться! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 15:34:34 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
я бы сначала определился что такое пустая строка, а то ж можно и так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2003, 18:27:00 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
я бы сначала определился что такое пустая строка Правильнее всего пустой строкой считать строку с количеством символов равным нулю. При этом имеют место те же неопределенности как пустая строка = или <> пустая строка а CHR(10), CHR(13) это символы форматирования как например пробел. Определить пустую строку как строку не имеющую "значимых" символов повлекло бы за собой еще больше концептуальных и логических сложностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 09:33:16 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
2 Violina А как же тогда select length('') from dual - ты же сама пример привела. По-моему было бы лучше, если бы в подобных случаях возникало исключение (кстати и с BOOLEAN-переменными тоже, большой минус, по моему возможность написания что-то типа: IF ''>'....' THEN ... ELSE ... END IF;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 10:13:57 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
2Violina > F_TEXT varchar2(50) DEFAULT ('') NOT NULL Ну не знаю default null not null ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 10:20:48 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Angel конечно правильнее было бы length('') = 0 но поскольку Оракл вообще не заморачивается на различие пустой строки и отсутствия данных, поэтому и выдается NULL в таком случае. Это не так страшно, просто вместо where length(field) = 0 надо использовать where field is null PS Это еще что, вот в Jbuilder есть такие понятия как assigned null и unassigned null, тогда совсем интересно становиться:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 10:21:20 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Violina: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А чему ты собственно удивляешься? NULL - это неизвестно что. Естественно, что когда ты пытаешься определить "длинна(незвестно что)" - получишь тоже "неизвестно что". Или ты считаешь длинна "неизвестно что" должна быть = 0? Тогда испозьзуй NVL - она для этого и предназначена. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 10:22:19 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to softbuilder с NVL все выглядит вообще красиво. Пустая строка и NULL конечно очень похожи, но есть отличия. Например если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль. Но кака я уже сказала поскольку оракл отождествляет пустую строку с null, то логично что length('') = null. to gluk F_TEXT varchar2(50) DEFAULT ('') NOT NULL Это был не совет а указание на ошибку в определении - отсутствовал тип данных F_TEXT DEFAULT ('') NOT NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 10:39:26 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Violina: 'Например если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль. " Где определяется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 10:53:01 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:01:33 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Это в будущем. Ты мне приведи пример, где сейчас реально "...если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:08:02 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
если пустая строка определяется как строка без символов, то известно что количество символов у нее ноль. Во первых это конструкция если ... то , т.е. если пустая строка определяется как строка с нулевых количеством символов, то тот факт что количество символов у нее ноль вытекает из самого определения. Тогда вопрос принимает вид, определяет ли Оракл пустую строку как строку с нулевых количеством символов. В Оракл явного определения 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 подразумевает одно и тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:25:33 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
"Где" - это из баз даных или "вообще"? Если второе, то не глядя скажу, что в Delphi, Java так и есть, могу еще потренироваться в VB проверку написать. Из баз данных за Sybase скажу, Interbase... Вообще ИМХО это только Oracle выпендрился с length('')=null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:28:21 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Denis Popov Конечно может и выпендрился, но по крайней мере, Оракл последователен в своей концепции, раз уж пустая строка рассматривается как NULL тогда и все эффекты от нее должны быть как от NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:34:46 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Ну уж это, пожалуй, не заслуга, а само собой разумеется, что так должно быть. Хотя я не совсем понимаю, почему конкатенация с NULL не дает NULL: Код: plaintext 1. 2. 3. 4. 5. По идее, если я хочу соединить пустую строку и непустую, то получу вполне предсказуемый вариант. Но почему именно в этой операции NULL ведет себя как пустая строка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:43:04 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Denis Ну уж это, пожалуй, не заслуга, а само собой разумеется, что так должно быть. Но тем не менее очень легко поддаться соблазну сделать какие отклонения ради удобства имплементации или использования. С конкатенацией действительно, NULL ведет себя как пустая строка. То есть отклонения все таки имеют место. По идее, если я хочу соединить пустую строку и непустую, то получу вполне предсказуемый вариант. Но почему именно в этой операции NULL ведет себя как пустая строка? Мне пришло в голову такое объяснение. Если бы было иначе, не помогла бы даже всемогущая функция палочка выручалочка NVL. Например в запросе select NVL(field, '') || 'X' from tbl; '' интерпретировалась бы как NULL и конкатенация с пустыми строками была бы просто невозможна, разве что использование CASE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:53:44 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Denis Popov: Да именно это я и хотел услышать, что так сделано например в Java. Просто я хотел бы что-бы Violina не утверждала голословно а привела бы конкретный пример. Потому-что, утверждение: Код: plaintext 1. 2. 3. не может являться доказательным, потому-что нет никакого определения. Можно говорить только о том, что соответствует это какому-либо стандарту или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 11:56:41 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
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)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 12:06:06 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Violina: Это всё детский лепет. Понятие пустая строка или не пустая строка, должно исходить не из исходя из понятия слов "пустой, строка" того или иного языка - русского, английского, с использованием словаря. А определятся на основании стандартов, типа ANSI/IEEE и иных. Не нужно обяснять на пальцах, если вы хотите что бы вас считали серьёзным программистом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 12:19:28 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Хорошо, хочу научиться на будущее. Что надо было мне сделать в этом случае? - привести пример Код: plaintext 1. 2. 3. 4. Денис ведь тоже вроде на ANSI не ссылался? to All Буду признательна за ссылку на более информативный тект по поводу пустых строк чем мною приведенную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 12:42:14 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Именно. Почему-то в этом форуме очень мало ссылок на стандарты и достаточно много объяснений, в том числе и самих стандартов, на русском, английском и других языках. Подразумевается, что каждый знает, где можно посмотреть эти стандарты, а здесь мы их именно толкуем и обсуждаем. Стандарт ANSI SQL92 явно различает NULL и пустую строку. В данном вопросе Oracle не следует стандарту. Найду прямую ссылку на стандарт- скажу. Пока лишь Краткое сравнение Oracle SQL и ANSI SQL Почему конкатенация NULL и не-NULL дает не-NULL - не знаю, потому и интересно, во-первых, как в стандарте, а во-вторых, как дело обстоит в других БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 13:00:58 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
to Violina: Код: plaintext 1. 2. 3. 4. 5. PL/SQL User’s Guide and Reference Release 8.1.6 December 1999 Part No. A77069-01 Expressions and Comparisons->Handling Nulls->Concatenation Operator-> Код: plaintext 1. 2. 3. 4. Я думаю этого достаточно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 13:10:19 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Самое интересное, что помню когда-то читал книжку, так там авторы со смаком экспериментировали с поведением символьных функций (подло подсовывая NULL) в разных версиях PL/SQL (правда помню точно, что до 8 версии) :) Oracle работает над тем, чтобы PL/SQL соответствовал полному стандарту (пока - начальному), что и видно из той цитаты, что привела Violina. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 13:13:35 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Понятно. Пример Дениса dan@oraspb> select null||'X' from dual; показывает случай когда NULL ведет себя как пустая строка. Правда из приведенной ссылки softbuilder' ом Оракл преподносит это не как NULL ведет себя как пустая строка а более нейтрально the concatenation operator ignores null operands. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 13:20:37 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
select TO_NUMBER(null)||'aaa' from dual Даже в таком виде как пустая строка :) 8.1.7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 17:02:38 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Обсуждение пустой строки в Oracle зашло в глубинные теоретические дебри. И все-же я считаю, что Oracle непоследователен: почему при поиске по пустой строке в условии WHERE нельзя подставить переменную (т.е. параметр Paswd=''): Код: plaintext 1. 2. 3. 4. 5. Почему приходится так извращаться? Почему не работает просто WHERE F_PASWD=Paswd ведь и поле и переменная являются строками нулевой длины = NULL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2003, 12:32:11 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Потому-что будет сравнение с NULL, которое даст NULL aka "теоретические дебри" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2003, 12:35:21 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Считаю, что для ХП делающими выборки по строковым параметрам это очень неудобно - придется не только прописывать условие сравнения поля с параметром, но еще и проверять их оба на IS NULL (как в вышеприведенном примере). ЗЫ: Гуру от Oracle! Может существует какая-то более простая конструкция для сравнения поля со строковым параметром на случай NULL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2003, 12:41:33 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Ochen' nelogicho poluchaet'sia dan@oraspb> select null||'X' from dual; N - X a SQL> select null+5 from dual; NULL+5 ---------- NULL SQL> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2003, 12:53:30 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Во посмеемся на: 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. Дел будет но вообщето "" не NULL должно быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 17:12:25 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Том Кайт написал, что это сделано в соответствии со спецификацией ANSI, MSSQL (в настройках по умолчанию), напротив нарушает стандарт в этом вопросе. На самом деле хотелось бы имет как минимум 2 типа NULL (ничего и все что угодно) и соответственно четверичную логику. То что пустая строка - NULL действительно странно, но если этого хочет стандарт :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 08:19:35 |
|
||
|
Поле DEFAULT значением
|
|||
|---|---|---|---|
|
#18+
Если кому интересно. Это из Quest-овского Knowledge Xpert for Oracle Administration 6.2 (наверное, соответствует максимум для 8i) Functions will do implicit conversion, if possible, of data types if other than the one needed are specified to them. Calling most functions with a NULL will return a NULL. The only functions that don't return a NULL are: w CONCAT Concatenates strings. w DECODE Performs explicit conversions. w DUMP Dumps a value. w NVL Allows for NULL value substitution. w REPLACE Allows for string replacement. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 12:33:52 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1989819]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
18ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 306ms |

| 0 / 0 |
