Oracle: найдите позицию ошибки в динамическом SQL, используя SQL или PL / SQL
Как найти позицию ошибки в инструкции динамического SQL в PL / SQL или SQL?
Из SQL * Plus я вижу положение ошибки, например, в недопустимом выражении SQL DML:
SYS@orcl> SELECT
2 X
3 FROM
4 TABLEX
5 /
TABLEX
*
ERROR at line 4:
ORA-00942: table or view does not exist
SQL * Plus показывает ошибку с номером строки, печатает и помечает эту строку звездочкой, где обнаружена ошибка.
Преобразовав в динамический SQL, я могу получить код ошибки (SQLCODE) и сообщение об ошибке (SQLERRM):
SYS@orcl> SET SERVEROUTPUT ON
SYS@orcl> BEGIN
2 EXECUTE IMMEDIATE 'SELECT X FROM TABLEX';
3 EXCEPTION
4 WHEN OTHERS THEN
5 DBMS_OUTPUT.PUT_LINE('SQLCODE:' || SQLCODE);
6 DBMS_OUTPUT.PUT_LINE('SQLERRM:' || SQLERRM);
7 END;
8 /
SQLCODE:-942
SQLERRM:ORA-00942: table or view does not exist
Но как мне получить позицию ошибки в строке динамического SQL?
Я вижу, что Oracle предоставляет SQL Communications Area (SQLCA), которая содержит интересную информацию об ошибке. В частности:
поля SQLCODE и SQLERRM (которые могут быть источником данных, полученных с помощью соответствующих функций PL / SQL),поле SQLERRD, где находится элемент SQLERRD (5), который задает «смещение ошибки анализа».Можно ли получить доступ к SQLERRD из PL / SQL или SQL? Если так, то как? Если нет, то какой другой метод может определить местонахождение ошибки PL / SQL или SQL?
(Вотhttp://docs.oracle.com/cd/B28359_01/appdev.111/b31231/chapter8.htm#BABIGBFF SQLCA задокументирована и доступна с помощью Pro * C.)
(Ответ здеськак объявить SQLCA.SQLERRD? кажется, указывает на то, что SQLERRD не определен в PL / SQL и поэтому недоступен.)
(Обсуждение здесьПочему Oracle не сообщает вам, КАКОЙ таблицы или представления не существует? дает некоторые рекомендации, чтобы показать плохой SQL с использованием файлов трассировки и показать местоположение ошибок в некоторых инструментах разработки.)