最近,我们的一位 DBA 建议我删除我的一个包中的 DBMS_OUTPUT.PUT_LINE() 至少有一个编译标志来控制它。最有力的论据是缓冲区限制将导致 DB 异常。虽然我完全同意我们不应该在生产中使用这样的调试代码,但我认为如果未设置set serveroutput on则 DBMS_OUTPUT.PUT_LINE() 不会引入问题。
所以我的第一个问题是DBMS_OUTPUT.PUT_LINE() 是否将行放入缓冲区,无论 serveroutput 是否打开。如果 DBMS_OUTPUT.PUT_LINE() 仅在服务器输出打开时将行放入缓冲区,则通常情况下我们不会打开它。会好的。汤姆关于性能观点的观点(“坦率地说,我不在乎。”)似乎支持我的论点。
我的第二个问题是关于缓冲区所在的缓冲区的位置(数据库服务器或客户端)。我猜它位于服务器端,那么无论是 SET SERVEROUTPUT ON 还是 DBMS_OUTPUT.ENABLE () 都会通过调用 DBMS_OUTPUT.GET_LINE() 使所有会话都可以从缓冲区读取。
我的最后一个问题是当缓冲区达到限制时会有什么影响。我们会在 DBMS_OUTPUT.PUT_LINE() 的最后一个调用者中收到错误吗?