2009-03-11 35 views

Trả lời

7

Có lẽ một trong những tùy chọn sẽ phù hợp với nhu cầu của bạn (tùy thuộc việc bạn viết một cái gì đó về phía máy chủ hoặc phía khách hàng):

(cập nhật Mark Harrison) Tôi đã đi với gói đầu ra của tôi-dbms trong bài AskTom. Một tính năng thực sự thú vị là bạn có thể truy cập vào các kết quả thông qua một khung nhìn để dễ dàng hiển thị đầu ra trong một chương trình máy khách. Tôi đổi tên thành tên ngắn hơn.

2

Bạn có thể sử dụng gói TCP để ghi đầu ra vào thiết bị đầu cuối hoặc bộ ghi dữ liệu từ xa. Hoàn toàn bàn giao để gỡ lỗi mã gói đang chạy trong các tác vụ đã lên lịch.

Edit: Đây là một thủ tục dụ:

procedure pDebug(str in varchar2) 
-- output debugging message to display or tcp console 
    is 
x number; 
l number; 
nPort number; 
sAddress varchar2(5000); 
    begin 
if c_bDebug = 1 then 
    if c_tcpbDebug = 1 then 
     if cSocket.remote_host is NULL then 
      nPort := strMetaDataValue('TCP-DEBUG-PORT'); 
      sAddress := strMetaDataValue('TCP-DEBUG-ADDRESS'); 
      dbms_output.put_line('tcp:port ' || nPort); 
      dbms_output.put_line('tcp:address ' || sAddress); 
      if length(sAddress) > 1 and nvl(nPort, 0) > 0 then 
       begin 
       dbms_output.put_line('tcp:open start ' ||to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS')); 
       cSocket := utl_tcp.open_connection(sAddress, nPort); -- open connection 
       dbms_output.put_line('tcp:open ' || to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS')); 
       c_tcpbDebug := 1; 
       exception 
        when others then 
         dbms_output.put_line(SQLERRM); 
         dbms_output.put_line('Cant open debug tcp session ' || SYSTIMESTAMp); 
         c_tcpbDebug := 0; 
       end; 
      else 
       c_tcpbDebug := 0; 
      end if; 
     end if;   

     if cSocket.remote_host is not NULL then 
      dbms_output.put_line('tcp:write'); 
      x := utl_tcp.write_line(cSocket, to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || ' ' || str); 
      x := utl_tcp.write_line(cSocket, utl_tcp.crlf); 
     end if; 
    end if; 
-- this bit prints out the debug statement in 254 char bits 
    l := length(str); 
    x := 1; 
    while x <= l loop 
     dbms_output.put_line(substr(str,x,254)); 
     x := x + 254; 
    end loop; 
end if; 
end pDebug; 
+0

thú vị, bạn có ví dụ về việc này không? cảm ơn! –

6

Phiên bản nào của Oracle? Cả hai giới hạn này đã được thư giãn trong các phiên bản gần đây. 10.2 hỗ trợ các dòng dài hơn 255 ký tự (giới hạn mới là 32k) và loại bỏ giới hạn kích thước bộ đệm tối đa. Oracle 9.2 có 255 ký tự trên mỗi dòng/1 MB tổng giới hạn, nhưng Oracle đã không hỗ trợ phiên bản đó.

1

Một tùy chọn khác, mặc dù có thể không phải là lựa chọn tuyệt vời, là viết vào nhật ký cảnh báo.

sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message '); 
2

INSERT là giải pháp thay thế tuyệt vời. Bạn không chỉ nhận được thông tin trong quá trình của bạn, nó còn tồn tại để tham khảo hoặc phân tích trong tương lai. Và kết quả có thể được lấy ra và lọc và xử lý bằng một ngôn ngữ rất phổ biến được gọi là SQL. Bạn có thể có một cột với một mặc định của sysdate để kiểm tra thời gian và thứ tự. Nó có thể được đặt bên trong một giao dịch tự trị để tránh mất việc đăng nhập do một sự quay trở lại.

1

Một hạn chế của dbms_output là đầu ra chỉ khả dụng sau khi câu lệnh kết thúc. Để theo dõi các quy trình chạy dài, tôi sử dụng dbms_pipe để gửi các thông báo trạng thái. Ở đầu bên kia của đường ống, bạn có thể xem quá trình này là gì.

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