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.)