Hầu hết các máy khách SQL sẽ báo cáo dòng và cột mà lỗi đã xảy ra. Nếu bạn không có IDE tốt, hãy sử dụng DBMS_SQL
.
Máy khách SQL
Hầu hết các IDE SQL sẽ đánh dấu số dòng và cột của lỗi. Ngay cả SQL * Plus cũng hiển thị chính xác vị trí xảy ra lỗi số không hợp lệ:
SQL> select *
2 from dual
3 where 1 = 1
4 and 1 = 'a'
5 and 2 = 2;
and 1 = 'a'
*
ERROR at line 4:
ORA-01722: invalid number
(Rất tiếc, Oracle SQL Developer không cung cấp chức năng này.)
DBMS_SQL
Nếu lựa chọn công cụ SQL của bạn bị hạn chế, bạn vẫn có thể tìm thấy số dòng có liên quan bằng cách sử dụng DBMS_SQL.LAST_ERROR_POSITION
.
declare
v_sql clob := q'[
select *
from dual
where 1 = 1
and 1 = 'a'
and 2 = 2
]';
v_cursor integer;
v_ignore number;
begin
v_cursor := dbms_sql.open_cursor;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
v_ignore := dbms_sql.execute(v_cursor);
exception when others then
dbms_output.put_line(sqlerrm);
dbms_output.put_line('Error starts here: '||
substr(v_sql, dbms_sql.last_error_position));
end;
/
Results:
ORA-01722: invalid number
Error starts here: 'a'
and 2 = 2
(Câu trả lời này giả sử bạn có thể chạy trực tiếp câu lệnh SQL. Nếu lỗi là một phần của chương trình PL / SQL, thì không có cách nào dễ dàng sau thực tế để tìm số dòng bên trong câu lệnh SQL, trừ khi bạn có thể chạy nó một lần nữa thông qua DBMS_SQL
. Ở đây, ngữ cảnh chính xác rất quan trọng.)