Ошибка при выполнении Merge через сценарий оболочки - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь выполнить скрипт, который вызывает оператор Merge через sqlplus.

Оператор merge выполняется нормально, но когда я выполняю его через скрипт оболочки, он выдает ошибку:

current_time=`date`
echo "FSG_PRCB_PRVD_FAC_SEQ table UPDATE STARTED at $current_time"
Result=`sqlplus -s $TgtUsrID/$TgtPswd@$TgtServer <<eof
whenever sqlerror exit sql.sqlcode; 
merge into FSG_WRK.FSG_PRCB_FAC_REF_DATA T1
   using
    (select NUM_ID, ALPHA_NUM_ID from FSG.FSG_PRCB_ADDRESS_CROSSWLK) T2
  ON (T1.ADDR_TYPE=T2.ALPHA_NUM_ID)
when matched then
     update set T1.ADDR_TYPE_N = T2.NUM_ID ;
eof
`

ERRORCODE=$?

#Check the return code from SQL Plus
if [ $ERRORCODE != 0 ]
then
  echo "********************"
  echo "ERROR: Updating Status Failed. ErrorCode: $ERRORCODE"
  exit -1
else
  echo "********************"
  echo "UUpdating Status  returns $Result"
       current_time=`date`
       echo "Updating Status Query finished at $current_time"
fi

Вывод:

Состояние обновления не удалось. Код ошибки: 174

Я не уверен, что пошло не так.

1 Ответ

0 голосов
/ 27 декабря 2018

Использование exit sql.sqlcode может вводить в заблуждение или даже опасно.

С Проект документации Linux :

Выход за пределы диапазона может привести кнеожиданные коды выхода.Значение выхода больше 255 возвращает код выхода по модулю 256. Например, выход 3809 дает код выхода 225 (3809% 256 = 225).

Вы видите код выхода, сообщенный как174, но исходный код ошибки мог быть любым, где mod(<actual code>, 256) оценивается как 174. Вы сможете увидеть действительный код ошибки и сообщение в вашей переменной $Result.

Вероятным кандидатом являетсяОшибка ORA-00942 (как mod(942, 256) равно 174) - и, как вы сказали, слияние работает автономно, вы, вероятно, обнаружите, что пользователь, к которому вы подключаетесь и выполняете слияние, представленное $TgtUsrID, делаетне иметь необходимых привилегий для таблиц, принадлежащих FSG и / или FSG_WRK.

Это показывает, что сообщенный код завершения может вводить в заблуждение или вводить в заблуждение.Потенциально опасная часть, если вы получите реальный код ошибки, который является точным кратным 256, например, допустимая квота пробела ORA-01536 "превышена для табличного пространства% s '. Поскольку mod(1536, 256) равно нулю, $ERRORCODE будет равно нулютоже, поэтому ваша проверка:

if [ $ERRORCODE != 0 ]

будет ложной, даже если ошибка действительно произошла.

Возможно, будет проще изменить ваш SQL на whenever sqlerror exit failure (возможно, с добавлениемиз rollback?), и тогда ваша проверка на ненулевое значение сработает, и вы можете использовать $Result, чтобы увидеть / сообщить, что было на самом деле неправильно.

...