2011-09-08 28 views
6

Tôi có khối PL/SQL chuyên sâu khá thời gian để tạo dấu vân tay từ cấu trúc phân tử. Tôi muốn in kết quả đầu ra sang giao diện điều khiển SQL * Plus để cung cấp phản hồi về số lượng cấu trúc đã được xử lý. Tôi có thể làm điều này với dbms_output.put_lineTheo dõi khối PL/SQL chạy dài

Tuy nhiên, mỗi lần được gọi là dòng mới đều được viết. Tôi muốn ghi đè lên dòng.

Ví dụ: hiện tại tôi có bên dưới.

Structure x of y processed 
Structure x of y processed 
Structure x of y processed 
Structure x of y processed 

Cuối cùng tôi lấp đầy bộ đệm khi tôi xử lý hàng nghìn bản ghi cấu trúc.

Có phương pháp nào tôi có thể sử dụng để chỉ ghi đè dòng đầu ra cuối cùng không?

Trả lời

15

Sử dụng DBMS_OUTPUT có nghĩa là SQL * Plus sẽ không hiển thị cho đến khi toàn bộ khối PL/SQL hoàn tất và sau đó sẽ hiển thị tất cả dữ liệu hiện có trong bộ đệm. Do đó, nó không phải là một cách thích hợp để cung cấp một trạng thái đang diễn ra.

Mặt khác, Oracle cung cấp gói DBMS_APPLICATION_INFO được thiết kế đặc biệt để giúp bạn theo dõi mã đang chạy của mình. Ví dụ, bạn có thể làm một cái gì đó giống như

CREATE PROCEDURE process_structures 
AS 
    <<other variable declarations>> 

    rindex BINARY_INTEGER; 
    slno  BINARY_INTEGER; 
    totalwork NUMBER := y; -- Total number of structures 
    worksofar NUMBER := 0; -- Number of structures processed 
BEGIN 
    rindex := dbms_application_info.set_session_longops_nohint; 

    FOR i IN (<<select structures to process>>) 
    LOOP 
    worksofar := worksofar + 1; 
    dbms_application_info.set_session_longops(
     rindex  => rindex, 
     slno  => slno, 
     op_name  => 'Processing of Molecular Structures', 
     sofar  => worksofar , 
     totalwork => totalwork, 
     target_desc => 'Some description', 
     units  => 'structures'); 
    <<process your structure with your existing code>> 
    END LOOP; 
END; 

Từ một * SQL riêng biệt Ngoài ra phiên, bạn có thể tiến bộ sau đó lời giáo huấn bằng cách truy vấn xem V$SESSION_LONGOPS

SELECT opname, 
     target_desc, 
     sofar, 
     totalwork, 
     units, 
     elapsed_seconds, 
     time_remaining 
    FROM v$session_longops 
WHERE opname = 'Processing of Molecular Structures'; 
+1

+1, ví dụ mẫu đẹp. – DCookie

0

Tôi không nghĩ rằng bạn có thể. Theo như tôi hiểu dbms_output nó chỉ không hoạt động theo cách đó.

Tôi khuyên bạn nên sử dụng đặt để lặp lại một dấu chấm và một dòng mới mỗi 1000 mục để xem điều gì đó đang diễn ra và viết vào bảng hoặc sắp xếp vị trí hiện tại để bạn có thể xem nếu bạn muốn biết.

1

Bạn cũng có thể gửi tin nhắn đến một đường ống có tên và có một quy trình khác đọc tin nhắn từ đường ống.

procedure sendmessage(p_pipename varchar2 
         ,p_message varchar2) is 
     s number(15); 
    begin 
     begin 
     sys.dbms_pipe.pack_message(p_message); 
     exception 
     when others then 
      sys.dbms_pipe.reset_buffer; 
     end; 

     s := sys.dbms_pipe.send_message(p_pipename, 0); 

     if s = 1 
     then 
     sys.dbms_pipe.purge(p_pipename); 
     end if; 
    end; 


    function receivemessage(p_pipename varchar2 
          ,p_timeout integer) return varchar2 is 
     n number(15); 
     chr varchar2(200); 
    begin 
     n := sys.dbms_pipe.receive_message(p_pipename, p_timeout); 

     if n = 1 
     then 
     return null; 
     end if; 

     sys.dbms_pipe.unpack_message(chr); 
     return(chr); 
    end;