Обработка не найденных исключений в sqlplus - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь вызвать команду sqlplus из сценария оболочки, а затем пытаюсь проверить успешность / неудачу, используя состояние выхода.Однако это не работает для не найденного сценария.Мне нужно получить код выхода, отличный от нуля, когда нет строк, удаленных для данного ввода.

sqlplus -s $DB_CONNECTION << EOF
        set heading off pages 0 echo off feedback off 
        WHENEVER SQLERROR EXIT SQL.SQLCODE
        BEGIN 
        DELETE FROM config where Id_ = '1345';
         IF SQL%ROWCOUNT = 0 THEN
           RAISE NO_DATA_FOUND;
         END IF;
        EXCEPTION
        WHEN NO_DATA_FOUND THEN
          EXIT 100;
        END;
EOF

1 Ответ

0 голосов
/ 14 мая 2018

Оператор PL / SQL EXIT работает только внутри LOOP. Проверьте это: Оператор EXIT . Это не эквивалентно exit <exitcode> или SQL * Plus 'exit. Shell, так что ваш блок PL / SQL не будет компилироваться вообще.

Более того, вы не можете гарантировать, что Shell захватит тот же код завершения, что и у Oracle SQLCODE, для исключений, подобных no_data_found. Поскольку у вас уже есть WHENEVER SQLERROR, вы можете вообще не включать блок EXCEPTION и просто проверять ненулевой код выхода.

sqlplus -s $DB_CONNECTION << EOF
        set heading off pages 0 echo off feedback off 
        WHENEVER SQLERROR EXIT SQL.SQLCODE
        BEGIN 
         DELETE FROM config where Id_ = '1345';
          IF SQL%ROWCOUNT = 0 THEN
            RAISE NO_DATA_FOUND;
          END IF;
        END;
EOF 
exit_code=$?
if [ $exit_code != 0 ]
then
  echo "No rows deleted for the given input"
fi
...