Сегодня на работе мы столкнулись со следующей проблемой: в одной из наших оболочек есть раздел вроде:
SQL*Plus user/pass@DB EOF
copy command 1 from one DB to another different DB
copy command 2 from one DB to another different DB
copy command 3 from one DB to another different DB
EOF
//check if the command worked
IF $? -eq 0 then
...
else
EXIT the shell
end if
Но в строке 2 " скопировать команду 2 из одной БД в другая другая БД"у нас была проблема. Структура таблицы DB1 имела (скажем) 2 столбца, которых в DB2 не было. Моя проблема в том, как я могу зафиксировать sql* плюс ошибки (CPY-xxxx)? так что в будущем я смогу предотвратить дальнейшее продвижение оболочки после проверки, сработала ли копия.
На данный момент мой план: :
Проверьте количество столбцов, если они отличаются, тогда я знаю, что это будет проблемой, и выйдите из оболочки.
Я знаю, что такого рода ошибки не относятся к типу ORACLE, поэтому они не могут быть зафиксированы следующим образом (с помощью WHENEVER sqlerror):
SQL*Plus user/pass@DB EOF
whenever sqlerror exit 2
copy command 1 from one DB to another different DB
copy command 2 from one DB to another different DB
copy command 3 from one DB to another different DB
exit 3;
EOF
//check if the command worked
IF $? -eq 3 then
...
else
EXIT the shell
end if
и ни один такой:
SQL*Plus user/pass@DB EOF
BEGIN
execute immediate 'copy command 2 from one DB to another different DB';
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION ...
EOF
//check if the command worked
IF $? -eq 0 then
...
else
EXIT the shell
end if
ОБНОВЛЕНИЕ Решение (не элегантное)!
SQL*Plus user/pass@DB EOF
whenever sqlerror exit 2
copy command 1 from one DB to another different DB
copy command 2 from one DB to another different DB
copy command 3 from one DB to another different DB
exit 3;
EOF >> SHELL_VARIABLE
//Check in the shell if the SHELL_VARIABLE (that will be a text I redirected the output from SQL*Plus) containts code like CRQ-XXXX then clearly we have an errore and exit