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 с использованием файлов трассировки и показать местоположение ошибок в некоторых инструментах разработки.)

Ответы на вопрос(2)

Ваш ответ на вопрос