Вопрос о базах и кеше.

hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by hren »

2Dmitry67

1. Вообще-то речь о ключевых словах и именах. Я почему-то думал, что ANSI SQL в этом смысле case insensitive по стандарту. Никогда не приходило в голову узнать, так ли это. В том, что касается литералов с case sensitivity в Oracle все в порядке. И настроить можно.

2. Никак нет, не есть :) Пустая строка - это пустая строка, а NULL - это NULL. Или я не совсем понял, что Вы имеете в виду?

Чуть позже. А понял. Я просто не привык думать на уровне SQL-а, я не разработчик. Да, в если делать инсерт в таблицу значения '', то вставится NULL. И при сравнениях они идентичны.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

hren wrote:Чуть позже. А понял. Я просто не привык думать на уровне SQL-а, я не разработчик. Да, в если делать инсерт в таблицу значения '', то вставится NULL. И при сравнениях они идентичны.


Как это ?
Это неправильно

''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by hren »

2zVlad: действительно, разница в понятиях "статический" и "динамический" SQL в DB2 и Oracle есть. Я, к сожалению, уезжаю сейчас, смогу ответить подробно только в воскресенье.
hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by hren »

Dmitry67 wrote:''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
Ничего не понял :) В Oracle в тексте запроса можно писать '', но вставить в символьное поле такое значение невозможно, вставится NULL. Поэтому сравнивать с '' нельзя - ошибки не будет, но и результат будет неверный, в таблице - то NULL. Надо всегда писать в сравнениях IS NULL или IS NOT NULL, поскольку '' всегда интерпретируется как NULL, а сравнивать с NULL с помощью = нельзя. Кстати, вроде Oracle уже давно обещал это дело поменять на стандарт, может в какой-нибудь из последних версий это уже и не так. Я под Oracle пишу только административные скрипты, поэтому у меня не самая точна яинформация об особенностях программирования под ним.
zVlad
Уже с Приветом
Posts: 15312
Joined: 30 Apr 2003 16:43

Post by zVlad »

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
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

hren wrote:
Dmitry67 wrote:''='' is NULL потому что лубое сравнение с NULL есть ПО ОПРЕДЕЛЕНИЮ NULL
Ничего не понял :) В Oracle в тексте запроса можно писать '', но вставить в символьное поле такое значение невозможно, вставится NULL. Поэтому сравнивать с '' нельзя - ошибки не будет, но и результат будет неверный, в таблице - то NULL. Надо всегда писать в сравнениях IS NULL или IS NOT NULL, поскольку '' всегда интерпретируется как NULL, а сравнивать с NULL с помощью = нельзя. Кстати, вроде Oracle уже давно обещал это дело поменять на стандарт, может в какой-нибудь из последних версий это уже и не так. Я под Oracle пишу только административные скрипты, поэтому у меня не самая точна яинформация об особенностях программирования под ним.


А, то есть они таки это обещают исправить
Отрадно
(Я кстати торопился и фразу свою коряво написал про NULL)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by 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
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Плохо...
То есть в Oracle часто проверки ставят на '' как особое значение ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
zVlad
Уже с Приветом
Posts: 15312
Joined: 30 Apr 2003 16:43

Post by zVlad »

Hren, получается что пустая строка '' по сути аналог 0 в случае чисел в Оракл-е считается NULL. В тоже время в DB2 и MS SQL различаются пустая строка '' и NULL значение для строковых данных. Жить конечно можно и несмертельно, когда знаешь об этом, но как то не последовательно это. Я например часто использую выражения типа:

STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.
User avatar
camel
Новичок
Posts: 86
Joined: 06 Dec 2002 18:21

Post by camel »

zVlad wrote:Hren, получается что пустая строка '' по сути аналог 0 в случае чисел в Оракл-е считается NULL. В тоже время в DB2 и MS SQL различаются пустая строка '' и NULL значение для строковых данных. Жить конечно можно и несмертельно, когда знаешь об этом, но как то не последовательно это. Я например часто использую выражения типа:

STR1 = ''
STR1 = STR1||'abcdef' или что-нибудь в этом роде. В Оракл как я понимаю я получу NULL? Или нет? Не удивлюсь если нет. Вроде уже об этом где-то в форуме говорилось. Тогда самое время будет удариться в философию.


хоть я и не hren (или нЕхрен :) , но отвечу - пустая строка в оракле есть то же самое, что NULL, за исключением конкатенации

то есть, STR1 = STR1||'abcdef' даст не null, а 'abcdef', а например, lpad('',3) даст null, а не три пробела

(в философию ударяться не буду - сразу предупреждаю на всякий случай :)
hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by hren »

camel wrote:хоть я и не hren
И я так думал в свое время :)
hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by hren »

По поводу динамических SQL в Oracle и DB2. Подумав, пришел к выводу, что писать особенно нечего. В Oracle, насколько я знаю, нет никакого механизма прекомпиляции запросов, все виды binding имеют место поздно и все запросы в этом смысле динамические.

Динамическим в Oracle называется SQL, код которого неизвестен или не полностью известен до опредленного момента выполнения пользовательской программы (Pro*C, PL/SQL). Такие запросы либо читаются откуда-то в текстовом виде, либо конструируются динамически. В большинстве случаев они создаются at run time с использованием prepare и в сложных случаях специальных дескрипторов. Но с момента передачи серверу для разбора такой запрос с его точки зрения практически ничем от статического не отличается. И кэшируется также.

Получается, что статических запросов в смысле DB2 в Oracle нет совсем.
zVlad
Уже с Приветом
Posts: 15312
Joined: 30 Apr 2003 16:43

Post by zVlad »

I see, hren, but could you, please, give me a definition of what is Static SQL in Oracle. Just few words.
hren
Уже с Приветом
Posts: 507
Joined: 15 May 2002 13:30
Location: Moscow, Russia

Post by 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.
zVlad
Уже с Приветом
Posts: 15312
Joined: 30 Apr 2003 16:43

Post by zVlad »

hren wrote:.......
Получается, что статических запросов в смысле DB2 в Oracle нет совсем.


Thank you, Hren. Does anybody want to argue to Hren and me :х ?

Return to “Вопросы и новости IT”