Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Yo.!
ну в этой редакции доки посчитали, что для девелопера будет удобней конструкцию которая является мостиком между двумя изолироваными мирами запихнуть в этот раздел, что с того ? это завется syntax sugar, от этого SQL не станет процедурней (гусары молчать, "особенную" субд не вспорминать ).
И опять нет прямого ответа на вопрос :)
3 апр 08, 15:53    [5499664]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Bogdanov Andrey
Я попытался извиниться за необоснованное изменение личного обращения. Наша дискуссия началась на "ты". Некоторые участники форума, считают переход на "вы" оскорбительным - я не знаю точно отношения к данному вопросу каждого из участников (сам я достаточно безразличен к этому), но считаю, что извинение не помешает.


В свою очередь прошу прощения.
Я немножко излишне взвинчен сегодня (в связи с событиями не связанными с общением на форуме)
3 апр 08, 16:23    [5499939]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Bogdanov Andrey wrote:
> Например, с какой стати DML и DDL в один язык объединили? Вполне можно
> разными считать - в каждом свои сиинтаксические конструкции. Есть еще
Хм... а что, я могу перемежать, скажем, DML и DDL в pl/sql?

Posted via ActualForum NNTP Server 1.4

3 апр 08, 16:33    [5500033]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
locky
Хм... а что, я могу перемежать, скажем, DML и DDL в pl/sql?

В PL/SQL Вы можете, скажем, перемежать DML и операторы управления транзакциями. Не можете перемежать DML и DDL. Внимание, вопрос: сколько же в результате мы получаем языков, почему именно столько и какое отношение к этому имеет возможность перемежать?
3 апр 08, 16:39    [5500067]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

softwarer wrote:
> В PL/SQL Вы можете, скажем, перемежать DML и операторы управления
> транзакциями. Не можете перемежать DML и DDL. Внимание, вопрос: сколько
> же в результате мы получаем языков, почему именно столько и какое
> отношение к этому имеет возможность перемежать?
а в т-скл можно перемежать... правда, не все ДДЛ допустимы, ессно....

в любом случае, в пл/скл граница куда более четкая, нежели в т-скл.
насколько это хорощо - вопрос десятый.

Posted via ActualForum NNTP Server 1.4

3 апр 08, 16:54    [5500189]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
locky
в любом случае, в пл/скл граница куда более четкая, нежели в т-скл.

На практике - безусловно, куда более четкая. Правда, по моим, возможно неверным, представлениям это вызвано исключительно одной деталью - неявным возвратом рекордсетов, наличествующим в T-SQL. Согласитесь, например, что между

-- sql
insert into "table" values (1);
insert into "table" values (2);
insert into "table" values (3);

и

-- pl/sql
begin
  insert into "table" values (1);
  insert into "table" values (2);
  insert into "table" values (3);
end;

разницы, особенно внешней, не так много (и к сожалению не каждый ораклоид расскажет, в чем эта разница состоит). И по аналогичным причинам не особо видна разница между

-- sql
select a, b, c from [table] where id = case when @a > @b then @a else @b end

и

-- t-sql
if @a > @b
  then select a, b, c from [table] where id = @a
  else select a, b, c from [table] where id = @b

(прошу прощения за возможные ошибки, мысль, я думаю, понятна.
3 апр 08, 17:08    [5500324]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Yo.!
Guest
locky

а в т-скл можно перемежать... правда, не все ДДЛ допустимы, ессно....

перемежать и в оракле не проблема, проблема делать это в транзакции. в MSSQL точно также ничерта нельзя пережать на IL snapshot. для версионника это делать в транзакции криво идиологически ....
3 апр 08, 17:10    [5500338]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

softwarer wrote:
> разницы, особенно внешней, не так много (и к сожалению не каждый
> ораклоид расскажет, в чем эта разница состоит). И по аналогичным
> причинам не особо видна разница между
Я, кстати, тоже не знаю - было интересно узнать, для "общего образования".

больше всего лично мне не нравится путаница в типах данных между скл и
пл/скл. обычно это вроде как не сильно важно, но иногда встреваем :(

Posted via ActualForum NNTP Server 1.4

3 апр 08, 17:27    [5500510]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
locky

softwarer wrote:
> разницы, особенно внешней, не так много (и к сожалению не каждый
> ораклоид расскажет, в чем эта разница состоит). И по аналогичным
> причинам не особо видна разница между
Я, кстати, тоже не знаю - было интересно узнать, для "общего образования".

Ну например:
SQL> create table a(a number(1));
Table created.
SQL> insert into a values(1);
1 row created.
SQL> insert into a values(10);
insert into a values(10)
                     *
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column

SQL> commit;
Commit complete.
SQL> select * from a;
         A
----------
         1

SQL> create table a(a number(1));
Table created.
SQL> begin
  2   insert into a values(1);
  3   insert into a values(10);
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column
ORA-06512: at line 3

SQL> commit;
Commit complete.
SQL> select * from a;
no rows selected
3 апр 08, 17:42    [5500661]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
locky
Я, кстати, тоже не знаю - было интересно узнать, для "общего образования".

Главным различием я бы назвал следующее:

SQL> create table inserted (i integer check (i <> 3));

Table created.

SQL> begin
  2    insert into inserted values (1);
  3    insert into inserted values (2);
  4    insert into inserted values (3);
  5    insert into inserted values (4);
  6  end;
  7  /

ERROR at line 1:
ORA-02290: check constraint (TEST.SYS_C0010272) violated 
ORA-06512: at line 4 

SQL> select count(*) from inserted;

  COUNT(*)                                                                      
----------                                                                      
         0

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

locky
больше всего лично мне не нравится путаница в типах данных между скл и пл/скл. обычно это вроде как не сильно важно, но иногда встреваем :(

Лично меня раздражает отсутствие boolean в SQL. А вообще... сейчас это малоактуально, а в восьмерке очень мешало - делаешь запрос, отлаживаешь, все отлично, вставляешь в PL/SQL - а он, сволочь, не компилируется. Типа "эта фича SQL в PL/SQL не поддерживается".
3 апр 08, 17:53    [5500764]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Yo.!
Guest
softwarer

Лично меня раздражает отсутствие boolean в SQL. А вообще... сейчас это малоактуально, а в восьмерке очень мешало - делаешь запрос, отлаживаешь, все отлично, вставляешь в PL/SQL - а он, сволочь, не компилируется. Типа "эта фича SQL в PL/SQL не поддерживается".


сотню раз разжевывалось: прсото PL/SQL машина в момент компиляции проверяет синтаксис SQL, никакого отношения к PL/SQL они не имеют ...
3 апр 08, 18:03    [5500845]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

softwarer wrote:
> Главным различием я бы назвал следующее:
да, про это я как-то забыл - незакетченный эксепшн на блоке....

а булеан... ну, обойтись можно, хотя и странно получается: булевские
операции и условия - есть, а самого булеана - нету.

Posted via ActualForum NNTP Server 1.4

3 апр 08, 18:28    [5500997]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
locky
а булеан... ну, обойтись можно

Можно, но глупо. Получается буквально следующее: я пишу функцию с результатом boolean, какую-нибудь проверку. В один прекрасный день мне хочется использовать ее в запросе, и наступает бред. Какое решение ни принимай - все, мягко говоря, не лучшее.
3 апр 08, 18:37    [5501032]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
locky
> Главным различием я бы назвал следующее:
да, про это я как-то забыл - незакетченный эксепшн на блоке....
Но стоит отметить, что данное поведение не является отличием SQL и PL/SQL. Это просто общий для Oracle принцип "атомарности".
3 апр 08, 19:25    [5501225]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Bogdanov Andrey wrote:
> Но стоит отметить, что данное поведение не является отличием SQL и
> PL/SQL. Это просто общий для Oracle принцип "атомарности".
проведя опыты - мне не показалось, что это "общий принцип атомарности".
без анонимного блока - одна строка, с анонимным блоком - ни одной.
кроме того, поставив ексепт можно привести второй случай к первому

Posted via ActualForum NNTP Server 1.4

3 апр 08, 19:37    [5501253]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Yo.! wrote:
> версионника это делать в транзакции криво идиологически ....
но ведь делают, собственно.
пусть даже и говорят "это не в транзакции".

Posted via ActualForum NNTP Server 1.4

3 апр 08, 19:42    [5501270]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
locky
проведя опыты - мне не показалось, что это "общий принцип атомарности"

Тем не менее, это так и есть. Чтобы увидеть это, сравните, например, в моем примере (с i < 3)

insert into inserted values (1);
insert into inserted values (2);
insert into inserted values (3);
insert into inserted values (4);

и

insert into inserted select rownum from dual connect by level < 5
3 апр 08, 19:48    [5501291]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

softwarer wrote:
> Тем не менее, это так и есть. Чтобы увидеть это, сравните, например, в
> моем примере (с i < 3)
странный принцип, если честно.
наверное, дело вкуса.
набор стейтментов трактуется либо как набор (в первом случае), либо как
единый стейтмент (в случае с блоком). хотя - на то блок и есть блок.

Posted via ActualForum NNTP Server 1.4

3 апр 08, 19:58    [5501335]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
locky
набор стейтментов трактуется либо как набор (в первом случае),

Тут следует еще учесть, что в Oracle нет понятия "скрипт" или аналогичного (как в MS, если не ошибаюсь, batch). Набор стейтментов в первом случае - это server call с клиента для каждого insert-а поочередно.

locky
хотя - на то блок и есть блок.

Можно провести аналогию со вложенными транзакциями.
3 апр 08, 20:21    [5501386]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
locky
странный принцип, если честно.
наверное, дело вкуса.
А на мой взгляд, нарушение этого принципа крайне станно. Можно, конечно, считать это делом вкуса. Вообще-то, математически подобные программные системы описываются теорией автоматов. И если операция недопустима (типа исключение произошло), то автомат не меняет свое состояние.

locky
набор стейтментов трактуется либо как набор (в первом случае), либо как
единый стейтмент (в случае с блоком). хотя - на то блок и есть блок.
В том-то и дело, что в случае с блоком это нет набора "стейтментов", есть одно обращение к базе данных. На которое она естественным образом реагирует.
Собственно именно в этом месте, на мой взгляд, и есть основное идеологическое различие между PL/SQL И T-sql. Если первый с самого начала рос как процедурный язык интегрированный с SQL, то второй начинался скорее как скриптовый язык для работы с SQL-сервером. Это, естественно, мое субъективное восприятие, в упрощенном изложении :). Но оно живет у меня года с 95-го и никак не проходит. :)
3 апр 08, 21:22    [5501497]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
Bogdanov Andrey
А на мой взгляд, нарушение этого принципа крайне странно.

А я вполне понимаю обе точки зрения :)

Сугубо формально можно сказать, что "когда сервер за меня что-то откатывает - это не есть хорошо, может я собирался исправить проблему и продолжить с места остановки". Однако на практике это удачное соглашение; я не припомню, чтобы оно мне мешало, зато в ряде случаев оно делает хороший код проще, а тупой код - надежнее.

Bogdanov Andrey
И если операция недопустима (типа исключение произошло), то автомат не меняет свое состояние.

Как мы с Вами знаем, в ряде аспектов состояние все-таки меняет. Поэтому выбор оказывается "в чем меняется, а в чем нет" - и это уже не вопрос формальной теории, вопрос практики.
3 апр 08, 21:37    [5501534]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
softwarer
Сугубо формально можно сказать, что "когда сервер за меня что-то откатывает - это не есть хорошо, может я собирался исправить проблему и продолжить с места остановки".
Эта позиция, на мой взгляд, крайне непродуктивна. По-моему, целостную парадигму на ее основе не построить. Ведь на самом деле даже при отдельно стоящем Insert его падению уже предшествовали какие-то действия (может быть там триггера были и т.п.), что-то в состоянии СУБД изменилось. К моменту получения exception успело выполниться несколько десятков (а может и сотен) команд процессора. Их мы тоже будем "продолжать с места остановки"? Все-таки все языки придерживаются принципа атомарности уровня оператора. Oracle просто попытался эту парадигму реализовать более глобально. Ну а насколько удачно - вопрос отдельный.
3 апр 08, 22:37    [5501654]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
StX
Guest
Yo.!
locky

а в т-скл можно перемежать... правда, не все ДДЛ допустимы, ессно....

перемежать и в оракле не проблема, проблема делать это в транзакции. в MSSQL точно также ничерта нельзя пережать на IL snapshot. для версионника это делать в транзакции криво идиологически ....

Простите за оффтоп и позднее зажигание: почему вы считаете что для версионника криво иметь DDL в транзакции?
Контрпример - PostgreSQL, чистый версионник. За очень малым исключением (создание/удаление базы, tablespace и сборки мусора) DDL в транзакции допустим и работает абсолютно корректно.
Почему орден св.Оракла это запрещает?
4 апр 08, 03:37    [5502062]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
Bogdanov Andrey
Эта позиция, на мой взгляд, крайне непродуктивна.

Согласен. Я просто "истины ради" указал на возможность раскритиковать этот подход со стороны некоего также истинного утверждения (давайте не углубляться в детали атомарности... мне кажется, ситуация понятна - например, если я делал большой-большой апдейт, и он слетел на миллионной записи, я хочу повторить его с where id >= 1000000.

Как я уже указал выше, мне нравится этот оракловый подход по сугубо статистическим причинам (нередко удобно, никогда не мешает).
4 апр 08, 09:43    [5502384]     Ответить | Цитировать Сообщить модератору
 Re: Циклы и IF'ы в Oracle по сравнению с MS SQL  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67463
Блог
StX
Контрпример - PostgreSQL, чистый версионник. За очень малым исключением (создание/удаление базы, tablespace и сборки мусора) DDL в транзакции допустим и работает абсолютно корректно. Почему орден св.Оракла это запрещает?

Коллега Yo отчасти горячится, но в его словах есть доля истины. Давайте я выдам одно очевидное соображение, а вы уж решайте, что есть чистый версионник и корректная работа.

Утверждение: корректный внутритранзакционный DDL возможен только при serializable изоляции в жестком смысле этого слова (в том самом, в котором в Oracle вообще нет serializable) Обосновать это очень просто: представьте себе, что я делаю в транзакции некоторое изменение структуры таблицы, несовместимое со старой. Скажем, alter table drop column или alter table add foreign key. Далее в той же транзакции я делаю запрос к модифицированной таблице и как-то использую полученные данные. Проблема в том, что при любом уровне ниже serializable я при этом должен получить записи, параллельно вставленные другими транзакциями в старую версию структуры. Это выливается в проблемы либо на физическом уровне - то самое нет колонки, несовпадение форматов - либо, что куда страшнее, на логическом (новая логика захавала неконвертированные старые данные, нарушена целостность).

Теперь давайте подумаем, что есть serializable в этом случае. На самом деле это ни что иное как эксклюзивная блокировка таблицы или иного крупного объекта (да еще и возможно с растущими из него). То есть решить эту задачу мы можем только блокировкой в худшем неверсионном стиле.

Прошу прощения, я не спал ночь, может завтра подумаю получше и решу, что неправ
4 апр 08, 10:06    [5502510]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить