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

Откуда:
Сообщений: 5
Недавно наткнулся на такие грабли. Сразу приведу пример, так как словами объяснять не умею.

Есть простой скрипт.
WHENEVER SQLERROR exit rollback
WHENEVER OSERROR continue

prompt Here comes error

--Вот тут будет ошибка уникальности ORA-00001
-- Вообще подойдет любая SQL-ошибка
INSERT INTO OBJECT
  (SELECT *
     FROM OBJECT
    WHERE ROWNUM = 1);

prompt NE-NE-NE!!!
exit

Ожидаю, что после ошибки SQLPLUS выйжет и не будет выполнена команда "prompt NE-NE-NE!!!"
На самом деле она выполняется

Кто-нибудь с таким сталкивался? Как это можно объяснить?. Как бы эти грабли обойти?

P.S. В гуглах пытался найти похожее - безрезультатно
13 июл 10, 13:16    [9094689]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Воспроизвести не удалось:
SQL> DEFINE _SQLPLUS_RELEASE
DEFINE _SQLPLUS_RELEASE = "1002000400" (CHAR)
SQL> DEFINE _EDITOR
DEFINE _EDITOR         = "Notepad" (CHAR)
SQL> DEFINE _O_VERSION
DEFINE _O_VERSION      = "Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production" (CHAR)
SQL> DEFINE _O_RELEASE
DEFINE _O_RELEASE      = "902000800" (CHAR)
SQL> 
SQL> WHENEVER SQLERROR exit rollback
SQL> WHENEVER OSERROR continue
SQL> 
SQL> prompt Here comes error
Here comes error
SQL> 
SQL> --Вот тут будет ошибка уникальности ORA-00001
SQL> -- Вообще подойдет любая SQL-ошибка
SQL> INSERT INTO OBJECT
  2    (SELECT *
  3  	  FROM OBJECT
  4  	 WHERE ROWNUM = 1);
     FROM OBJECT
          *
ERROR at line 3:
ORA-00942: table or view does not exist 

выполните в SQL*Plus
DEFINE _SQLPLUS_RELEASE
DEFINE _EDITOR         
DEFINE _O_VERSION      
DEFINE _O_RELEASE      
И покажите результат.
13 июл 10, 13:30    [9094828]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Elic
Member

Откуда:
Сообщений: 29991
Гасраталиев Тимур
На самом деле она выполняется
Версия плюса?

Воспроизвелось (linux):
oracle@server2:/tmp> cat > tst.sql
WHENEVER SQLERROR exit rollback
WHENEVER OSERROR continue
exec raise dup_val_on_index
prompt NE-NE-NE!!!

oracle@server2:/tmp> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Jul 13 12:27:51 2010

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining options

SQL> @tst        
BEGIN raise dup_val_on_index; END;
*
ERROR at line 1:
ORA-00001: unique constraint (.) violated
ORA-06512: at line 1


NE-NE-NE!!!
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
10.2.0.5.0 linux 64 - нет.
13 июл 10, 13:37    [9094907]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Elic
Member

Откуда:
Сообщений: 29991
Гасраталиев Тимур
Как бы эти грабли обойти?
Позитивную реакцию на ошибки определять до негативной, например :)
+
oracle@server2:/tmp> cat > tst.sql               
WHENEVER OSERROR continue
WHENEVER SQLERROR exit rollback
exec raise no_data_found
prompt NE-NE-NE!!!

oracle@server2:/tmp> sqlplus owner_erip/owner_old

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Jul 13 12:41:33 2010

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining options

SQL> @tst
BEGIN raise no_data_found; END;

*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 1


Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining options
13 июл 10, 13:46    [9095016]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
да...
Guest
/OFF
Elic
Позитивную реакцию на ошибки определять до негативной, например :)

грандмастер бубна. преклоняюсь
13 июл 10, 13:51    [9095066]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Elic
Member

Откуда:
Сообщений: 29991
да...
грандмастер бубна. преклоняюсь
Комбинаторику не проходил?
13 июл 10, 13:57    [9095127]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Гасраталиев Тимур
Member

Откуда:
Сообщений: 5
Elic
Гасраталиев Тимур
Как бы эти грабли обойти?
Позитивную реакцию на ошибки определять до негативной, например :)


Да, помогает. На самом деле сейчас меня больше интересует даже не вопрос как исправить.
Вот интересно, это нормальное поведение или баг?

Информация о версии
+
SQL> DEFINE _SQLPLUS_RELEASE
DEFINE _SQLPLUS_RELEASE = "1002000300" (CHAR)
SQL> DEFINE _EDITOR
DEFINE _EDITOR = "Notepad" (CHAR)
SQL> DEFINE _O_VERSION
DEFINE _O_VERSION = "Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options" (CHAR)
SQL> DEFINE _O_RELEASE
DEFINE _O_RELEASE = "1002000400" (CHAR)
13 июл 10, 14:12    [9095299]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Гасраталиев Тимур
Вот интересно, это нормальное поведение или баг?
Есть похожий баг SQL*Plus для Windows.
Полегчало? :-)
13 июл 10, 14:33    [9095557]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Elic
Member

Откуда:
Сообщений: 29991
Гасраталиев Тимур
Вот интересно, это нормальное поведение или баг?
Результат команд соответствует документации? :)
13 июл 10, 14:33    [9095567]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 940
Elic
Гасраталиев Тимур
Вот интересно, это нормальное поведение или баг?
Результат команд соответствует документации? :)


Интересно, если результат команд не соответствует документации ( или соответствует) - какой достоверный вывод (в контексте - баг/не баг и если баг, то где, в системе , в документации, или в обеих) из этого можно сделать?
:)

Best regards

Maxim
13 июл 10, 17:20    [9097392]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Maxim Demenko
Интересно, если результат команд не соответствует документации ( или соответствует) - какой достоверный вывод (в контексте - баг/не баг и если баг, то где, в системе , в документации, или в обеих) из этого можно сделать?
Достоверный ответ вы можете получить через My Oracle Support.
Если это баг известный, то скажут какой.
Если это баг неизвестный, то заведут новый баг.
Если это баг документации, то аналогично.
Если это не баг, а фича, то объяснят и это... :-)
13 июл 10, 17:39    [9097552]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Elic
Member

Откуда:
Сообщений: 29991
Maxim Demenko
Интересно, если результат команд не соответствует документации ( или соответствует) - какой достоверный вывод (в контексте - баг/не баг и если баг, то где, в системе , в документации, или в обеих) из этого можно сделать?
:)
Случаи бывают разные... А тут простейшие команды, но результат неожиданный. Даже не нужно привлекать иерархию "индусов", чтобы сделать вывод.

P.S. Умный в гору не пойдёт, умный гору обойдёт (с) :)
13 июл 10, 18:56    [9098049]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
KaterinkO
Member

Откуда:
Сообщений: 1
Да ни разу это не баг -- видимо, OSERROR -- более общая ошибка, чем SQLERROR
3 мар 11, 19:59    [10322162]     Ответить | Цитировать Сообщить модератору
 Re: Грабли в SQLPLUS c WHENEVER SQLERROR  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18487
Да-да, баг во всех остальных версиях, кроме упомянутого SQL*Plus 10.2.0.3

Да, и, кстати, "теплое" более общее определение, чем "мягкое"
4 мар 11, 02:24    [10322985]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить