Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Пятничная задачка на внимание  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Не выполняя код, угадать что выведет SQLPLUS после его выполнения:
begin
  for rec in 
  (
    select 1 a, 
           to_number(replace('- ',    ' ', 9)),
           to_number(replace('-     ',' ', 9))
    from dual 
    order by 2, 3
  ) loop
    dbms_output.put_line(rec.a);
  end loop;
exception
  when others then
    dbms_output.put_line(2);
end;
/
В ответах просьба использовать spoiler
24 фев 11, 17:50    [10285525]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
_Nikotin,

по идее ругнется, потому как алиасы колонок одинаковы.
24 фев 11, 18:02    [10285607]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
comphead,

SPOILER !!! :(
24 фев 11, 18:04    [10285623]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
Data corruption
Guest
_Nikotin,

что-то я не догоняю в чем прикол :)
select 1 a
    from dual 
вернет одно значение, смысл его гонять в цикле ?
24 фев 11, 18:06    [10285637]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Data corruption,

можно connect by level < 3 добавить если хочется :) смысл цикла в другом.
24 фев 11, 18:10    [10285666]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
Elic
Member

Откуда:
Сообщений: 29990
Задачка неплоха. Только при чём тут "внимание"?
24 фев 11, 18:13    [10285685]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
_Nikotin
comphead,

SPOILER !!! :(


spoiler == spooler ??

если да, то только что проверил, валится на алиасах...

или чего то не понимаю.
24 фев 11, 18:14    [10285695]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6740
comphead,

+

наверное
24 фев 11, 18:17    [10285711]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
comphead,

имел в виду прятать ответы в [spоiler][/spoiler]
24 фев 11, 18:18    [10285719]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
_Nikotin,

пардоньте :)
24 фев 11, 18:27    [10285778]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
пятница-13
Guest
_Nikotin,

И в развитие темы :

какие 1 или 2 строки нужно добавить чтобы ошибка эта исчезла ? ;)
25 фев 11, 07:13    [10287067]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54395
пятница-13
_Nikotin,

И в развитие темы :

какие 1 или 2 строки нужно добавить чтобы ошибка эта исчезла ? ;)
разве одной буквы недостаточно?
25 фев 11, 09:03    [10287330]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
пятница-13
Guest
andreymx,

без добавления алиаса
26 фев 11, 11:43    [10293444]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
пятница-13
andreymx,

без добавления алиаса

(задний) комментарий - не алиас, но его достаточно
to_number(replace('-     ',' ', 9))  --

или унарный +
+to_number(replace('-     ',' ', 9)) 
и т.п.
-1*-to_number(replace('-     ',' ', 9))
26 фев 11, 14:31    [10293679]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
Купер Д.Ф.
Guest
А в чем вообще прикол отгадывать как поведет себя PL/SQL машина?

В чем соль то этой конкретной задачи?

Копание в говнокоде плохо попахивает..
26 фев 11, 17:55    [10294027]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Купер Д.Ф.
А в чем вообще прикол отгадывать как поведет себя PL/SQL машина?

В чем соль то этой конкретной задачи?

Копание в говнокоде плохо попахивает..

(в порядке занудства) следует заметить, что PL/SQL машина тут не предмет исследования, а лишь средство демонстрации. по сути - она не имеет отношения к теме.

в пятничных задачах (имхо) не следует искать вечных истин, а вот нюанс найти / (освежить) - запросто.
кому это интересно - тому интересно, а ежели вам оно не надобно - то дело ваше.
26 фев 11, 19:11    [10294131]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
Купер Д.Ф.
Guest
orawish,

вы считаете, что особенности компилятора плскл тут нипричем?
27 фев 11, 00:13    [10294932]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Купер Д.Ф.
orawish,

вы считаете, что особенности компилятора плскл тут нипричем?

конечно
SQL> with t as
  2  (select to_number(replace('- ',    ' ', 9)),
  3          to_number(replace('-     ',' ', 9))
  4     from dual
  5  ) select * from t;
) select * from t
         *
ERROR at line 5:
ORA-00918: column ambiguously defined
27 фев 11, 00:38    [10295007]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
Купер Д.Ф.
Guest
orawish,

Конечно?

create or replace procedure test10 is
begin
  for rec in 

  (
    select 1 a, 
           to_number(replace('- ',    ' ', 9)),
           to_number(replace('-     ',' ', 9))
    from dual 
    order by 2, 3
  ) loop
    dbms_output.put_line(rec.a);
  end loop;
exception
  when others then
    dbms_output.put_line(2);
end;
/
show errors;

Warning: Procedure created with compilation errors
Errors for PROCEDURE TEST10:
 
LINE/COL ERROR
-------- ----------------------------------------------------------------------------------
3/3      PLS-00402: alias required in SELECT list of cursor to avoid duplicate column names
3/3      PL/SQL: Statement ignored

А что это тогда? Ошибка времени выполнения?)))

Т.е. это не реакция компилятора на комент вместо алиаса справа позволяет откомпилить таки этот говнокод?
Странное поведение и скорее баг напоминает.
27 фев 11, 00:47    [10295022]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Купер Д.Ф.
orawish,

Конечно?
..
А что это тогда? Ошибка времени выполнения?)))

Т.е. это не реакция компилятора на комент вместо алиаса справа позволяет откомпилить таки этот говнокод?
Странное поведение и скорее баг напоминает.

какое отношение имеет pl/sql вообще (вкупе с его компилятором) к примеру, который я привёл?
имхо, тему можно было бы обозначить как особенности формирования имени столбца запроса в oracle sql.

разумеется, ничего хорошего в тестовом коде я не вижу. но, зато, тут очевидна демонстрация проблемы, которую элементарно
могут получить, например, любители работать с запросами позиционно.
тут демонстрируется, что различие значений колонок запросов не гарантирует уникальности алиасов. и (имхо) не надо
слишком поверхностно к этой проблеме относиться. в статическом коде (например, в статическом pl/sql) это лишь подтверждает
правило - указывай алиасы явно. но ещё же - есть запросы, формируемые динамически. и там - не так всё просто..
27 фев 11, 01:31    [10295062]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
Купер Д.Ф.
Guest
orawish,

Да ну? а SQL не пофиг как вы там запрос формируете, с алиасом... без него...?
Выполните его и посмотрите результат. Ошибки не будет.
SQL> select 1 a,
  2             to_number(replace('- ',    ' ', 9)),
  3             to_number(replace('-     ',' ', 9))
  4      from dual
  5      order by 2, 3;

         A TO_NUMBER(REPLACE('-','',9)) TO_NUMBER(REPLACE('-','',9))
---------- ---------------------------- ----------------------------
         1                           -9                       -99999

SQL>

Кстати и "open cur for этот селект" также не даcт ошибки. А вот когда вы ретурните такой курсор в приложение, то будет сюрприз. И не факт что ваш хак его исправит.

Это ж каким д.. надо быть чтобы калькулируемое поле без алиса в курсорах представлять.
И не случайно, а практиковать такой подход...

Хороший такой способ обратить внимание на проблему. Изощренный. Начинающие сразу захавают.
27 фев 11, 02:22    [10295096]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задачка на внимание  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Купер Д.Ф.
orawish,

Да ну? а SQL не пофиг как вы там запрос формируете, с алиасом... без него...?
Выполните его и посмотрите результат. Ошибки не будет.
SQL> select 1 a,
  2             to_number(replace('- ',    ' ', 9)),
  3             to_number(replace('-     ',' ', 9))
  4      from dual
  5      order by 2, 3;

         A TO_NUMBER(REPLACE('-','',9)) TO_NUMBER(REPLACE('-','',9))
---------- ---------------------------- ----------------------------
         1                           -9                       -99999

SQL>

Кстати и "open cur for этот селект" также не даcт ошибки. А вот когда вы ретурните такой курсор в приложение, то будет сюрприз. И не факт что ваш хак его исправит.

Это ж каким д.. надо быть чтобы калькулируемое поле без алиса в курсорах представлять.
И не случайно, а практиковать такой подход...

Хороший такой способ обратить внимание на проблему. Изощренный. Начинающие сразу захавают.

вот вам и ну.
смотрите внимательнее - вы нарисовали запрос, в котором столбцы 2 и 3 имеют одинаковые имена.
сам по себе, этот запрос рабочий - для позиционного api. но вот любая попытка разобраться в именах его столбцов обломится.
pl/sql тут глубоко прав в том, что это обстоятельство честно заметил при компиляции.
так же себя поведёт (т.е. заметит конфликт имён и обломится) каждый, кто в именах нуждается. например sql:
select * from (ляля);
так чем же, по вашему, pl/sql виноват? тем, что использует при работе с курсорами в статическом коде именованную нотацию?
вы предлагаете данную реализацию изменить? лично я - против (спасибо партии родной уже за execute immediate ).

Купер Д.Ф.
Кстати и "open cur for этот селект" также не даcт ошибки. А вот когда вы ретурните такой курсор в приложение, то будет сюрприз. И не факт что ваш хак его исправит.
..

а вот не факт, что сюрприз будет. вы мне рассказываете про своё приложение. и без микроскопа видно, что api в нем именованное (что, вообще говоря, нормально), а вот умей оно работать позиционно - тот курсор вполне данные извлечёт.

ну а про хаки - вы всерьёз подумали, это моя рекомендация? чур меня
рекомендация - следите за алиасами
27 фев 11, 03:10    [10295119]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить