Страница 3 из 3
Добавлено: Сб окт 04, 2003 10:22 am
Dmitry67
hren писал(а):Dmitry67 писал(а):''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
Ничего не понял

В Oracle в тексте запроса можно писать '', но вставить в символьное поле такое значение невозможно, вставится NULL. Поэтому сравнивать с '' нельзя - ошибки не будет, но и результат будет неверный, в таблице - то NULL. Надо всегда писать в сравнениях IS NULL или IS NOT NULL, поскольку '' всегда интерпретируется как NULL, а сравнивать с NULL с помощью = нельзя. Кстати, вроде Oracle уже давно обещал это дело поменять на стандарт, может в какой-нибудь из последних версий это уже и не так. Я под Oracle пишу только административные скрипты, поэтому у меня не самая точна яинформация об особенностях программирования под ним.
А, то есть они таки это обещают исправить
Отрадно
(Я кстати торопился и фразу свою коряво написал про NULL)
Добавлено: Пн окт 06, 2003 6:55 am
hren
2zVlad:
вот результат выполнения в Oracle 8.1.7.4
SQL> create table hrenum (num varchar(20));
Table created.
SQL> desc hrenum
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM VARCHAR2(20)
SQL> insert into hrenum values ('');
1 row created.
SQL> insert into hrenum values (' ');
1 row created.
SQL> insert into hrenum values (' ');
1 row created.
SQL> select num, length(num) from hrenum;
NUM LENGTH(NUM)
-------------------- -----------
1
1
SQL> select * from hrenum where num is null;
NUM
--------------------
SQL> select count(*) from hrenum where num is null;
COUNT(*)
----------
1
Добавлено: Пн окт 06, 2003 7:00 am
Dmitry67
Плохо...
То есть в Oracle часто проверки ставят на '' как особое значение ?
Добавлено: Пн окт 06, 2003 7:23 am
zVlad
Hren, получается что пустая строка '' по сути аналог 0 в случае чисел в Оракл-е считается NULL. В тоже время в DB2 и MS SQL различаются пустая строка '' и NULL значение для строковых данных. Жить конечно можно и несмертельно, когда знаешь об этом, но как то не последовательно это. Я например часто использую выражения типа:
STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.
Добавлено: Пн окт 06, 2003 9:43 am
camel
zVlad писал(а):Hren, получается что пустая строка '' по сути аналог 0 в случае чисел в Оракл-е считается NULL. В тоже время в DB2 и MS SQL различаются пустая строка '' и NULL значение для строковых данных. Жить конечно можно и несмертельно, когда знаешь об этом, но как то не последовательно это. Я например часто использую выражения типа:
STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.
хоть я и не hren (или нЕхрен

, но отвечу - пустая строка в оракле есть то же самое, что NULL, за исключением конкатенации
то есть, STR1 = STR1||'abcdef' даст не null, а 'abcdef', а например, lpad('',3) даст null, а не три пробела
(в философию ударяться не буду - сразу предупреждаю на всякий случай

Добавлено: Пн окт 06, 2003 1:35 pm
hren
camel писал(а):хоть я и не hren
И я так думал в свое время

Добавлено: Пн окт 06, 2003 1:56 pm
hren
По поводу динамических SQL в Oracle и DB2. Подумав, пришел к выводу, что писать особенно нечего. В Oracle, насколько я знаю, нет никакого механизма прекомпиляции запросов, все виды binding имеют место поздно и все запросы в этом смысле динамические.
Динамическим в Oracle называется SQL, код которого неизвестен или не полностью известен до опредленного момента выполнения пользовательской программы (Pro*C, PL/SQL). Такие запросы либо читаются откуда-то в текстовом виде, либо конструируются динамически. В большинстве случаев они создаются at run time с использованием prepare и в сложных случаях специальных дескрипторов. Но с момента передачи серверу для разбора такой запрос с его точки зрения практически ничем от статического не отличается. И кэшируется также.
Получается, что статических запросов в смысле DB2 в Oracle нет совсем.
Добавлено: Пн окт 06, 2003 2:23 pm
zVlad
I see, hren, but could you, please, give me a definition of what is Static SQL in Oracle. Just few words.
Добавлено: Вт окт 07, 2003 1:05 pm
hren
This is from Oracle Pro*C/C++ Precompiler Programmer's Guide:
However, some applications must accept (or build) and process a variety of SQL statements at run time. For example, a general-purpose report writer must build different SELECT statements for the various reports it generates. In this case, the statement's makeup is unknown until run time. Such statements can, and probably will, change from execution to execution. They are aptly called dynamic SQL statements.
Unlike static SQL statements, dynamic SQL statements are not embedded in your source program. Instead, they are stored in character strings input to or built by the program at run time. They can be entered interactively or read from a file.
__________________
My guess based on the text above is that "static" SQL is the one "embedded in your source program". Which is obvious without Oracle's wizdom

As far as I know, after the statement is made up and transferred to Oracle server there is no difference in terms of execition.
Добавлено: Вт окт 07, 2003 1:47 pm
zVlad
hren писал(а):.......
Получается, что статических запросов в смысле DB2 в Oracle нет совсем.
Thank you, Hren. Does anybody want to argue to Hren
and me
?