Oracle: Znajdź pozycję błędu w dynamicznym SQL za pomocą SQL lub PL / SQL

Jak znaleźć pozycję błędu w instrukcji Dynamic SQL w PL / SQL lub SQL?

Z SQL * Plus widzę pozycję błędu na przykład w nieprawidłowej instrukcji 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 pokazuje błąd wraz z numerem linii i drukuje i zaznacza tę linię gwiazdką, gdzie znaleziono błąd.

Konwersja do dynamicznego SQL, mogę uzyskać kod błędu (SQLCODE) i komunikat o błędzie (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

Ale w jaki sposób uzyskać pozycję błędu w dynamicznym łańcuchu SQL?

Widzę, że Oracle udostępnia obszar komunikacji SQL (SQLCA), który zawiera interesujące informacje o błędzie. W szczególności:

pola SQLCODE i SQLERRM (które mogą być źródłem danych pobranych za pomocą odpowiednich funkcji PL / SQL),pole SQLERRD, w którym element SQLERRD (5) daje „parse error offset”.

Czy można uzyskać dostęp do SQLERRD z PL / SQL lub SQL? Jeśli tak to jak? Jeśli nie, jaka inna technika może podać lokalizację błędu z PL / SQL lub SQL?

(Tutajhttp://docs.oracle.com/cd/B28359_01/appdev.111/b31231/chapter8.htm#BABIGBFF SQLCA jest udokumentowana i dostępna za pomocą Pro * C.)

(Odpowiedź tutajjak zadeklarować SQLCA.SQLERRD? wydaje się wskazywać, że SQLERRD nie jest zdefiniowany w PL / SQL i dlatego nie jest dostępny.)

(Dyskusja tutajDlaczego Oracle nie mówi, KTÓRYCH tabela lub widok nie istnieje? podaje kilka sugestii, aby pokazać zły SQL przy użyciu plików śledzenia i pokazać lokalizację błędów w niektórych narzędziach programistycznych.)

questionAnswers(2)

yourAnswerToTheQuestion