Я запускаю блок PL / SQL ниже из скрипта. Как вы можете видеть, он добавляет столбец и должен перехватывать любые исключения - среди них уже существует тот, который будет добавлен в столбец.
Теперь, если я запускаю этот файл и столбец уже существует, я получаю сообщение об ошибке:
Код ошибки: -1735
Сообщение об ошибке: ORA-01735: недействительноОпция ALTER TABLE
Это все хорошо, но если вместо этого я запусту внутренний SQL;это SQL, который следует за execute immediate
сам по себе, вместо этого я получаю это сообщение, которое является более точным:
ORA-01430: добавляемый столбец уже существует в таблице
Первая ошибка имеет код ошибки -1735 , и я могу перехватить ее с помощью when
, которое закомментировано в приведенном ниже коде;если это не закомментировано, вместо этого будет результат:
Произошла какая-то другая ошибка
Я не смог поймать -1430 исключение, хотя, хотя это, кажется, является основной причиной исключения.
Итак, мой вопрос: есть ли способ получить доступ к этому «внутреннему» исключению в этом случае? (это даже допустимый термин в этом случае?) Другими словами, может ли это бытьизменены, чтобы предоставить более конкретное сообщение об ошибке?
DECLARE
column_exists exception;
pragma exception_init (column_exists , -1430);
general_error exception;
pragma exception_init (general_error , -1735);
BEGIN
execute immediate 'ALTER TABLE my_table
ADD (some_column VARCHAR2(10 CHAR));';
EXCEPTION
-- I expected / wanted this to catch my error in order
-- to let me output a more specific message:
WHEN column_exists THEN
DBMS_OUTPUT.PUT_LINE('The column or index already exists');
-- Note: Commented out, but would otherwise catch the general error.
-- (I tested it here just to confirm that I can catch exceptions this way)
-- WHEN general_error THEN
-- DBMS_OUTPUT.PUT_LINE('Some other error occurred');
-- General catch: Generates the first message quoted above:
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error code: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error message: ' || SQLERRM);
END;
/