2010-06-24 44 views
10

tôi có chức năng nhỏ sau đây mà không biên dịch:Làm cách nào để khắc phục lỗi "Báo cáo SQL bị bỏ qua" này?

function f_query_01 Return interval Day to second is 
    start_time timestamp(3); 
    end_time timestamp(3); 
    time_diff interval Day to second; 
    c_query_number number; 

begin 

    start_time := systimestamp; 
    select count(*) into c_query_number from wg; <--This is the line that errors out 
    end_time := systimestamp; 
    time_diff := start_time - end_time; 

    return time_diff; 

end f_query_01; 

Trình biên dịch mang lại cho tôi những lỗi sau đây:

Error(29,3): PL/SQL: SQL Statement ignored 
Error(29,44): PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here 

gì đang gây ra lỗi này và làm thế nào tôi có thể sửa chữa nó?

+0

Liệu 'select count (*) vào c_query_number từ wg;' làm việc bên ngoài hàm, khi chạy trong cùng cơ sở dữ liệu/lược đồ làm hàm? –

+0

Thú vị. Nó đã thử mã này, thay thế wg cho một cái bàn nhỏ khác. Biên dịch và chạy thành công. Bạn có chắc đây chính là mã có sự cố không? –

+3

Vấn đề là bảng wg không tồn tại. Khi tôi đổi tên bảng thành tên chính xác thì tất cả đều ổn. Tôi thực sự cảm thấy thông báo lỗi là khá sai lầm trong trường hợp này, điều đó xảy ra, nhưng nó vẫn còn bực bội. – twamn

Trả lời

10

Dường như bảng wg không tồn tại. Khi cập nhật tên bảng chính xác, biên dịch sẽ hoạt động mà không có lỗi. Một thông điệp từ trình biên dịch của bảng không tồn tại sẽ hữu ích nhất.

+4

Kiểm tra google, tôi phải đồng ý - thông báo lỗi kém. –

+0

Tôi nghĩ lý do đằng sau thông báo lỗi là nếu đối tượng không có trong từ điển dữ liệu, thì nó phải là một đối tượng được xác định cục bộ, do đó "thủ tục, hàm, gói hoặc loại", tất cả những thứ có thể được định nghĩa với một hàm. – Allan

+1

Khi tôi biên dịch mã, tôi gặp lỗi 'bảng không tồn tại'. Khi tôi biên dịch nó khi tôi có một hàm gọi là wg, tôi đã nhận được lỗi được mô tả. Có thể có một từ đồng nghĩa công khai với một từ khác 'wg' ở đâu đó. –

1
CREATE OR REPLACE FUNCTION f_query_01 
    RETURN NUMBER 
IS 
BEGIN 
    DECLARE 
     c_query_number NUMBER DEFAULT NULL; 
     start_time  DATE DEFAULT NULL; 
     end_time   DATE DEFAULT NULL; 
     time_diff  NUMBER DEFAULT NULL; 
    BEGIN 
     SELECT CAST (SYSTIMESTAMP AS DATE) INTO start_time FROM DUAL; 

     SELECT COUNT (*) INTO c_query_number FROM ws; 

     SELECT CAST (SYSTIMESTAMP AS DATE) INTO end_time FROM DUAL; 

     time_diff := start_time - end_time; 

     RETURN time_diff; 
    END; 
END f_query_01; 
Các vấn đề liên quan