Проверьте, работает ли команда COPY (от SQL* Plus) или нет - PullRequest
0 голосов
/ 07 января 2020


Сегодня на работе мы столкнулись со следующей проблемой: в одной из наших оболочек есть раздел вроде:

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
...