2010-08-12 33 views
5

Chúng tôi thấy rất nhiều lỗi "ORA-00936: thiếu biểu thức" trong nhật ký ứng dụng của chúng tôi. Có cách nào trong Oracle để xác định những gì tuyên bố (s) đang thất bại?Oracle: Có cách nào để nhận các lỗi cú pháp SQL gần đây không?

Tôi đã thử truy vấn v $ sql, nhưng những câu lệnh này không được chèn vào chế độ xem đó vì chúng không vượt qua kiểm tra cú pháp.

Ứng dụng C# của chúng tôi đang sử dụng LINQ để tạo truy vấn tới cơ sở dữ liệu Oracle. Điều này làm cho nó một chút khó khăn để có được truy vấn sql từ ứng dụng. Tôi đã hy vọng tôi có thể lấy nó từ Oracle dễ dàng hơn.

Trả lời

5

Bạn có thể tạo một kích hoạt trong Oracle sẽ đăng nhập tất cả các lỗi (hoặc khá nhiều tất cả - NO_DATA_FOUND không được coi là lỗi). Trong ví dụ dưới đây, bất kỳ lỗi nào trong lược đồ được ghi lại trong bảng TRACK_DETAIL (lỗi trong một hàng, SQL không thành công trong phần tiếp theo). Bạn có thể làm cho nó phức tạp hơn với số thứ tự, ngày/giờ, v.v.

create table track_detail (val varchar2(4000)); 

create or replace procedure track (p_text IN VARCHAR2) IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
begin 
    insert into track_detail(val) 
    values (p_text); 
    commit; 
end; 
. 
/
create or replace TRIGGER log_err after servererror on schema 
DECLARE 
    v_temp VARCHAR2(2000) := substr(dbms_utility.format_error_stack,1,2000); 
    v_num NUMBER; 
    v_sql_text ora_name_list_t; 
begin 
    v_temp := translate(v_temp,'''','"'); 
    track(v_temp); 
    v_num := ora_sql_txt(v_sql_text); 
    v_temp := null; 
    BEGIN 
    FOR i IN 1..v_num LOOP 
     v_temp := v_temp || v_sql_text(i); 
    END LOOP; 
    EXCEPTION 
    WHEN VALUE_ERROR THEN NULL; 
    END; 
    v_temp := translate(v_temp,''''||chr(0)||chr(10),'"'); 
    track(v_temp); 
end; 
/

Hãy nhớ thả (hoặc tắt) trình kích hoạt khi bạn đã hoàn thành nó.

+0

+1 Tôi đã quên các trình kích hoạt cấp cơ sở trong khi viết câu trả lời: ( – ThinkJet

+0

Thats tuyệt vời. Tôi không biết bạn có thể tạo trình kích hoạt trên "servererror"! Cảm ơn! – CodingWithSpike

+0

Chấp nhận câu trả lời này vì câu trả lời phù hợp nhất với tình huống của tôi. Tôi có thể đi vào một DB chạy, tạo ra các kích hoạt, có được lỗi, và loại bỏ các kích hoạt mà không ảnh hưởng đến người dùng hoặc triển khai lại mã ứng dụng. – CodingWithSpike

1

Bạn có thể thử sử dụng một cái gì đó như Wireshark trên cổng được sử dụng để kết nối với Oracle để xem những câu lệnh SQL nào đang được gửi. Có thể không phải là câu trả lời hay nhất - nhưng nó có thể đưa bạn đến nơi bạn cần phải đi nhanh hơn.

2

Nếu bạn có thể bật theo dõi sql từ mã ứng dụng bằng cách nào đó (thay đổi tập hợp phiên sql_trace = true), báo cáo sẽ hiển thị trong tệp theo dõi trên máy chủ cơ sở dữ liệu.

1

Thử giải pháp giám sát SQL từ Kris Vandermotten blog.

Ngoài ra, bạn có thể chuyển hướng đăng nhập với DataContext.Log property:

using (NorthwindDataContext context = new NorthwindDataContext()) 
{ 
    context.Log = Console.Out; 
} 

Hoặc sử dụng bất kỳ công cụ gỡ lỗi khác như LInQ to Entities Visualizer ...

+0

Tôi chưa bao giờ nhận ra rằng thuộc tính Nhật ký đã có ở đó. Cảm ơn vì điều đó! Về mặt kỹ thuật, chúng tôi đang sử dụng một biểu thức LINQ đối với một Entity Framework ObjectContext, không phải là một DataContext. Điều này cũng đã được trên một máy chủ là tôi không có quyền truy cập để thay đổi mã, do đó tôi muốn lấy truy vấn từ Oracle. – CodingWithSpike

Các vấn đề liên quan