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

Откуда: Москва
Сообщений: 170
Требуется при возникновении ошибки прервать выполнение сценария SQLPLUS. Вопрос: Как это сделать?
Уточнение: Директива whenever sqlerror завершает работу SQLPLUS. Надо, чтобы SQLPLUS продолжал свою работу.

Спасибо
18 мар 10, 15:00    [8498284]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Царь в голове
Директива whenever sqlerror завершает работу SQLPLUS
Вообще-то это не так. Exit завершает работу SQlPlus, а вот ставить его после whenever sqlerror - это уже другой вопрос
18 мар 10, 15:18    [8498450]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
В SQL*Plus® User's Guide and Reference команда "whenever sqlerror exit" описана в контексте ситнаксиса комадны whenever sqlerror. Поиск по форуму дал мне много ответов, указывающих на использование этой команды. Однако в данном случае она не подходит.
18 мар 10, 15:43    [8498682]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Сценарий - это что? Скрипт(Pl-блок, набор Pl-блоков), набор скриптов ?
18 мар 10, 15:51    [8498761]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Царь в голове,

whenever sqlerror continue
18 мар 10, 15:52    [8498765]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
Скрипт это, например, вот что:
set echo off
set feed off
set serveroutput on
set autoprint off
begin
  if 1=1 then 
    raise_application_error(-20010, 'This is a not allowed operation!');
  end if;
end;
/
exec dbms_output.put_line('-= this command mast not be run =-');
Если написать whenever sqlerror continue в начале скрипта, то последняя команда исполнится.
Если написать whenever sqlerror exit, то она не исполнится, но произойдет выход в коммандную строку.
Мне нужно остаться в плюсе и чтобы скрипт прекратил свою работу.
Желание, вроде бы, разумное, но вот как его исполнить - загадка!
18 мар 10, 16:04    [8498916]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
JaRo
Member

Откуда:
Сообщений: 1659
если это ПЛ-блок, как Вы привели, то, что мешает в нем ошибку и перехватить?
18 мар 10, 16:15    [8499040]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
Да нет же! В том то и дело, что это сценарий. Он состоит из нескольких вызовов (SQL-операторов и/или PL/SQL-блоков), а также команд самого SQL*Plus. Это стандартная возможность стандартного средства Oracle SQL*Plus.
18 мар 10, 16:36    [8499282]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
И надо, чтобы при возникновении ошибки в одном из этих вызовов, остальные вызовы не выполнялись.
18 мар 10, 16:37    [8499309]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
JaRo
Member

Откуда:
Сообщений: 1659
ну так и оформляйте это отдельным файлом, он будет падать, остальное будет работать
18 мар 10, 16:42    [8499374]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
Сейчас оно так и есть: Возникает ошибка, а следующие вызовы продолжают исполняться. Но надо наоборот: чтобы после ошибки больше ничего из этого скрипта не исполнялось.
18 мар 10, 16:57    [8499549]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
dba123
Member

Откуда:
Сообщений: 1054
Царь в голове,

всё блоками с проверками на ошибку или файлами делайте,
как подсказали
whenever sqlerror continue;
whenever oserror  exit failure;
set heading off verify off feedback off serveroutput on
variable rc number
declare
app_error EXCEPTION;
PRAGMA 	EXCEPTION_INIT(app_error,-20010);
ret varchar2(150) default '';
begin
:rc:=0;
--select 1/0  into ret from dual;
--dbms_output.put_line(ret);
raise_application_error(-20010, 'This is a not allowed operation!');
select 10/2  into ret from dual;
dbms_output.put_line(ret);
 exception
  when zero_divide then
   select dbms_utility.format_error_stack into ret from dual;
   :rc:=substr(ret,instr(ret,'ORA-',-1)+4,5);
   dbms_output.put_line('ORA-'||:rc);
  when app_error then
   select dbms_utility.format_error_stack into ret from dual;
   :rc:=substr(ret,instr(ret,'ORA-',-1)+4,5);
   dbms_output.put_line('ORA-'||:rc);
end;
/
print :rc

begin
 if ltrim(:rc) = '0' then 
   dbms_output.put_line('-= this command print when =ok=-');
 elsif ltrim(:rc) = '1476' then 
   dbms_output.put_line('-= this command print when =zero_divide=-');
 elsif ltrim(:rc) = '20010' then 
   dbms_output.put_line('-= this command print when =app_error 20010=-');
 end if;
end;
/
или комментировать трюком
-- idea from Tanel Poder SQl*Plus trick to comment out PL/SQL code
define _if_11g="/* NOT 11g" /* dummy */
18 мар 10, 16:58    [8499566]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Царь в голове
Сейчас оно так и есть: Возникает ошибка, а следующие вызовы продолжают исполняться. Но надо наоборот: чтобы после ошибки больше ничего из этого скрипта не исполнялось.
бр...

Ещё раз - часть которая рассматривается как общая выносится в отдельный файл, а основной скрипт выглядит так:
@1.sql

-- остальный действия
18 мар 10, 17:00    [8499582]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
Пробую:
Файл 1.sql
begin
  if 1=1 then 
    raise_application_error(-20010, 'This is a not allowed operation!');
  end if;
end;
Файл test.sql
set echo off
set feed off
set serveroutput on
set autoprint off
whenever sqlerror continue
@@1.sql
/
exec dbms_output.put_line('-= this command mast not be run =-');
Исполнение
SQL> @c:\test.sql
begin
*
ERROR at line 1:
ORA-20010: This is a not allowed operation!
ORA-06512: at line 3

-= this command mast not be run =-
SQL>

Т.е. не работает. Строка "-= this command mast not be run =-" не должна была появиться :-(

dba123, Попозже попробую разобраться в Ваших версиях. Надеюсь поллитра не понадобится :-)
18 мар 10, 17:40    [8499937]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Царь в голове
Т.е. не работает. Строка "-= this command mast not be run =-" не должна была появиться :-(
Ну так и добавляйте её туда же в файл!!!
18 мар 10, 17:47    [8499989]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
dba123, по первому варианту: мне нужна обработка ошибки за пределами PL/SQL-блока, т.е. средствами SQL*Plus. В блоке должна произойти неперехваченная ошибка, а SQL*Plus должен напечатать мне эту ошибку и остановиться, невзирая на то, что в скрипте после этого блока идут другие вызовы. При этом сам SQL*Plus не должен завершать свою работу (т.е. не должен разрывать соединение и передавать управление коммандной строке ОС).
По второму варианту: А нельзя ли примерчик?
18 мар 10, 19:56    [8500569]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Царь в голове
В блоке должна произойти неперехваченная ошибка, а SQL*Plus должен напечатать мне эту ошибку и остановиться, невзирая на то, что в скрипте после этого блока идут другие вызовы. При этом сам SQL*Plus не должен завершать свою работу (т.е. не должен разрывать соединение и передавать управление коммандной строке ОС).
Раскажите зачем вам всё это нужно?
Какой цели вы хотите таким образом достичь?
Возможно, что эта цель достигается иным способом и/или что это неверная цель.

Tom Kyte
We need to ask “WHY”, what is the goal
18 мар 10, 20:21    [8500672]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
SQL*Plus,
Приведу только один простой пример. Я разрабатываю сценарий. Запускаю его на исполнение (@<имя файла>). На первом или втором шаге (вызове) получаю ошибку (например, таблицу он не смог создать по каким-то причинам). По логике моего сценария в этом случае дальнейшее выполнение не имеет смысла (например, дальше идут на эту таблицу индексы, констрейнты, ссылки из других объектов и.т.д.). Надо напечатать мне эту ошибку и остановиться. При разработке таких (пробных) запусков будет много, и каждый раз запускать SQL*Plus и подключаться к БД, – это по меньшей мере непроизводительная трата времени. Сидеть и смотреть на поток ошибок от последующих пятнадцати запусков тоже не особо интересно (как правило, всегда интересна только первая ошибка).
19 мар 10, 10:40    [8502241]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Elic
Member

Откуда:
Сообщений: 29980
Царь в голове
Надо напечатать мне эту ошибку и остановиться. При разработке таких (пробных) запусков будет много, и каждый раз запускать SQL*Plus и подключаться к БД, – это по меньшей мере непроизводительная трата времени.
Нет. Это тебе лишь кажется.
19 мар 10, 11:11    [8502508]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Царь в голове
.. каждый раз запускать SQL*Plus и подключаться к БД, – это по меньшей мере непроизводительная трата времени.
Ну да, нажать для повтора команды вызова SQL*Plus кнопки ""вверх" и "Enter" - это ужасная трата времени... :-))))
А сделать то же самое для повторного запуска скрипта в SQL*Plus - это офигительная его экономия! :-))))

Прав Том Кайт! "Спрашивайте "ПОЧЕМУ", какова цель?"
19 мар 10, 12:25    [8503245]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
SQL*Plus,

для уточнения проблем при отладке скриптов удобно оставаться в той же сессии и видеть накопившиеся значения переменных и данных. А иначе все накатится-откатится, выдаст маловразумительную ошибку и анализируй с чистого листа...
19 мар 10, 13:29    [8503957]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Bfink
SQL*Plus,

для уточнения проблем при отладке скриптов удобно оставаться в той же сессии и видеть накопившиеся значения переменных и данных. А иначе все накатится-откатится, выдаст маловразумительную ошибку и анализируй с чистого листа...
Автор привел другие источники своего хотения...
19 мар 10, 16:19    [8506063]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Царь в голове
Member

Откуда: Москва
Сообщений: 170
Автор (т.е. я) сказал:
автор
и каждый раз запускать SQL*Plus и подключаться к БД, – это по меньшей мере непроизводительная трата времени.
Стрелка вверх, Enter – этого недостаточно! Нодо еще, как минимум, пароль ввести. Сделать батник с зашитым в него паролем, – за это меня служба безопасности... ну, скажем так, недовольна она будет. В данном случае все необходимые параметры устанавливаются в самом скрипте, и смотреть bind-переменные именно сейчас мне не нужно, но, вообще, это было бы очень полезно при разработке сложных скриптов.
Господа, давайте же будем конструктивными! Вопрос был в том, КАК ЭТО СДЕЛАТЬ. Вопрос ЗАЧЕМ хотя и не задавался, но в данном случае на него можно найти много ответов.
19 мар 10, 17:10    [8506586]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнение сценария (скрипта) не завершая SQLPLUS  [new]
Elic
Member

Откуда:
Сообщений: 29980
Царь в голове
Вопрос был в том, КАК ЭТО СДЕЛАТЬ.
Т.е. ты до сих пор не понял? И тебе нужно сказать прямым текстом? Тогда ответ - это "однокоренное" с вопросом слово :)
19 мар 10, 17:32    [8506771]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить