Вопрос о базах и кеше.
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
2Dmitry67
1. Вообще-то речь о ключевых словах и именах. Я почему-то думал, что ANSI SQL в этом смысле case insensitive по стандарту. Никогда не приходило в голову узнать, так ли это. В том, что касается литералов с case sensitivity в Oracle все в порядке. И настроить можно.
2. Никак нет, не есть Пустая строка - это пустая строка, а NULL - это NULL. Или я не совсем понял, что Вы имеете в виду?
Чуть позже. А понял. Я просто не привык думать на уровне SQL-а, я не разработчик. Да, в если делать инсерт в таблицу значения '', то вставится NULL. И при сравнениях они идентичны.
1. Вообще-то речь о ключевых словах и именах. Я почему-то думал, что ANSI SQL в этом смысле case insensitive по стандарту. Никогда не приходило в голову узнать, так ли это. В том, что касается литералов с case sensitivity в Oracle все в порядке. И настроить можно.
2. Никак нет, не есть Пустая строка - это пустая строка, а NULL - это NULL. Или я не совсем понял, что Вы имеете в виду?
Чуть позже. А понял. Я просто не привык думать на уровне SQL-а, я не разработчик. Да, в если делать инсерт в таблицу значения '', то вставится NULL. И при сравнениях они идентичны.
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
hren wrote:Чуть позже. А понял. Я просто не привык думать на уровне SQL-а, я не разработчик. Да, в если делать инсерт в таблицу значения '', то вставится NULL. И при сравнениях они идентичны.
Как это ?
Это неправильно
''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
Ничего не понял В Oracle в тексте запроса можно писать '', но вставить в символьное поле такое значение невозможно, вставится NULL. Поэтому сравнивать с '' нельзя - ошибки не будет, но и результат будет неверный, в таблице - то NULL. Надо всегда писать в сравнениях IS NULL или IS NOT NULL, поскольку '' всегда интерпретируется как NULL, а сравнивать с NULL с помощью = нельзя. Кстати, вроде Oracle уже давно обещал это дело поменять на стандарт, может в какой-нибудь из последних версий это уже и не так. Я под Oracle пишу только административные скрипты, поэтому у меня не самая точна яинформация об особенностях программирования под ним.Dmitry67 wrote:''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
-
- Уже с Приветом
- Posts: 15312
- Joined: 30 Apr 2003 16:43
Dmitry67 wrote:hren wrote:Чуть позже. А понял. Я просто не привык думать на уровне SQL-а, я не разработчик. Да, в если делать инсерт в таблицу значения '', то вставится NULL. И при сравнениях они идентичны.
Как это ?
Это неправильно
''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
I'm not with what are you guys talking about. Dmitry67, can you evaluate this:
CREATE TABLE,NUMBERS,(NUM VARCHAR(8));
INSERT INTO NUMBERS VALUES ('');
INSERT INTO NUMBERS VALUES (' ');
INSERT INTO NUMBERS VALUES (' ');
SELECT NUM, LENGTH(NUM) FROM NUMBERS;
---------+---------+---------+---------+-------
NUM
---------+---------+---------+---------+-------
0
1
4
DSNE610I NUMBER OF ROWS DISPLAYED IS 3
SELECT * FROM NUMBERS WHERE NUM IS NULL;
---------+---------+---------+---------+---------+------
NUM
---------+---------+---------+---------+---------+------
DSNE610I NUMBER OF ROWS DISPLAYED IS 0
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
hren wrote:Ничего не понял В Oracle в тексте запроса можно писать '', но вставить в символьное поле такое значение невозможно, вставится NULL. Поэтому сравнивать с '' нельзя - ошибки не будет, но и результат будет неверный, в таблице - то NULL. Надо всегда писать в сравнениях IS NULL или IS NOT NULL, поскольку '' всегда интерпретируется как NULL, а сравнивать с NULL с помощью = нельзя. Кстати, вроде Oracle уже давно обещал это дело поменять на стандарт, может в какой-нибудь из последних версий это уже и не так. Я под Oracle пишу только административные скрипты, поэтому у меня не самая точна яинформация об особенностях программирования под ним.Dmitry67 wrote:''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
А, то есть они таки это обещают исправить
Отрадно
(Я кстати торопился и фразу свою коряво написал про NULL)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
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
вот результат выполнения в 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
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
-
- Уже с Приветом
- Posts: 15312
- Joined: 30 Apr 2003 16:43
Hren, получается что пустая строка '' по сути аналог 0 в случае чисел в Оракл-е считается NULL. В тоже время в DB2 и MS SQL различаются пустая строка '' и NULL значение для строковых данных. Жить конечно можно и несмертельно, когда знаешь об этом, но как то не последовательно это. Я например часто использую выражения типа:
STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.
STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.
-
- Новичок
- Posts: 86
- Joined: 06 Dec 2002 18:21
zVlad wrote:Hren, получается что пустая строка '' по сути аналог 0 в случае чисел в Оракл-е считается NULL. В тоже время в DB2 и MS SQL различаются пустая строка '' и NULL значение для строковых данных. Жить конечно можно и несмертельно, когда знаешь об этом, но как то не последовательно это. Я например часто использую выражения типа:
STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.
хоть я и не hren (или нЕхрен , но отвечу - пустая строка в оракле есть то же самое, что NULL, за исключением конкатенации
то есть, STR1 = STR1||'abcdef' даст не null, а 'abcdef', а например, lpad('',3) даст null, а не три пробела
(в философию ударяться не буду - сразу предупреждаю на всякий случай
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
По поводу динамических SQL в Oracle и DB2. Подумав, пришел к выводу, что писать особенно нечего. В Oracle, насколько я знаю, нет никакого механизма прекомпиляции запросов, все виды binding имеют место поздно и все запросы в этом смысле динамические.
Динамическим в Oracle называется SQL, код которого неизвестен или не полностью известен до опредленного момента выполнения пользовательской программы (Pro*C, PL/SQL). Такие запросы либо читаются откуда-то в текстовом виде, либо конструируются динамически. В большинстве случаев они создаются at run time с использованием prepare и в сложных случаях специальных дескрипторов. Но с момента передачи серверу для разбора такой запрос с его точки зрения практически ничем от статического не отличается. И кэшируется также.
Получается, что статических запросов в смысле DB2 в Oracle нет совсем.
Динамическим в Oracle называется SQL, код которого неизвестен или не полностью известен до опредленного момента выполнения пользовательской программы (Pro*C, PL/SQL). Такие запросы либо читаются откуда-то в текстовом виде, либо конструируются динамически. В большинстве случаев они создаются at run time с использованием prepare и в сложных случаях специальных дескрипторов. Но с момента передачи серверу для разбора такой запрос с его точки зрения практически ничем от статического не отличается. И кэшируется также.
Получается, что статических запросов в смысле DB2 в Oracle нет совсем.
-
- Уже с Приветом
- Posts: 15312
- Joined: 30 Apr 2003 16:43
-
- Уже с Приветом
- Posts: 507
- Joined: 15 May 2002 13:30
- Location: Moscow, Russia
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.
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.
-
- Уже с Приветом
- Posts: 15312
- Joined: 30 Apr 2003 16:43