Jak mogę znaleźć pozycję błędu w dynamicznej instrukcji SQL w PL/SQL lub SQL?Oracle: Znajdź pozycję błędu w dynamicznym SQL używając SQL lub PL/SQL
z SQL * Plus widzę pozycję błędu, na przykład nieprawidłowy instrukcja SQL DML:
[email protected]> 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 z numerem linii i drukuje i znaki tej linii z gwiazdką, w której znaleziono błąd.
Konwersja do dynamicznego SQL, mogę uzyskać kod błędu (SQLCODE) i komunikat o błędzie (SQLERRM):
[email protected]> SET SERVEROUTPUT ON
[email protected]> 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 ciągu Dynamiczny SQL?
Widzę, że Oracle zapewnia obszar komunikacji SQL (SQLCA), który zawiera interesujące informacje o błędzie. W szczególności:
- pól SQLCODE i SQLERRM (które mogą być źródłem danych pobranych z odpowiednich funkcji PL/SQL),
- pole SQLERRD gdzie (5) Element SQLERRD że daje " analizować błąd błędu ".
Czy można uzyskać dostęp do SQLERRD z PL/SQL lub SQL? Jeśli tak to jak? Jeśli nie, to jaka inna technika może podać lokalizację błędu z PL/SQL lub SQL?
(Tutaj http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/chapter8.htm#BABIGBFF obszaru komunikacyjnego SQL jest udokumentowana i dostępne z Pro * C).
(odpowiedź tutaj how to declare SQLCA.SQLERRD? wydaje się wskazywać, że SQLERRD nie jest zdefiniowany w PL/SQL, a zatem nie jest dostępna.)
(Omówiona tutaj dyskusja zawiera pewne sugestie dotyczące wyświetlania złego kodu SQL za pomocą plików śledzenia i pokazywania lokalizacji błędów w niektórych narzędziach programistycznych.)
staram się naśladować zachowanie SQL * Plus, drukując linię naruszające zasady i kolejny wiersz Marka początek błąd gwiazdka. Mogę uzyskać to, czego potrzebuję, analizując stos błędów, aby uzyskać liczbę linii i kolumn, ale czy istnieje łatwiejszy sposób? –
O ile mi wiadomo, nie ma łatwiejszego sposobu. –