Dbms输出未在Toad中显示输出

时间:2019-05-20 07:57:26

标签: sql oracle plsql toad dbms-output

我执行的过程具有与其他数据库的数据库链接,并且dbms输出未显示输出。该按钮为绿色。当我单击右键时,仅启用“ Toogle Output”和“ Polling”。

image

2 个答案:

答案 0 :(得分:0)

如果我理解正确,它就是这样的:

  • 有两个数据库,我们称它们为DB_LOCAL和DB_REMOTE
  • 有一个驻留在DB_REMOTE数据库中的过程-简化-看起来像这样:

    create or replace procedure p_remote as
    begin
      dbms_output.put_line('In remote procedure');
    end;
    

    执行后,将显示“正在远程过程”消息。

  • DB_LOCAL数据库中有一个数据库链接,可让您访问DB_REMOTE,例如

    create database link db_link_to_remote
      connect to remote_user
      identified by remote_password
      using 'db_remote';
    
  • 您以本地用户身份连接到DB_LOCAL数据库,并以以下方式调用远程过程

    connect local_user/local_password
    begin
      p_remote@db_link_to_remote;
    end;
    

    您希望看到“正在执行远程过程”消息,但没有。

如果上述正确,则原因如下:一个过程在远程服务器上的远程数据库中运行。它已执行并且确实打印了消息,但是显示在远程服务器上,而不是本地服务器上。

那该怎么办?一种选择是创建一个具有OUT参数并返回消息作为参数的过程。然后,您可以在本地连接时显示。很快,在远程数据库中:

create or replace procedure p_remote (par_msg out varchar2) is
begin
  par_msg := 'In remote procedure';
end;

在本地数据库中:

declare
  l_msg varchar2(200);
begin
  p_remote@db_link_to_remote(l_msg);
  dbms_output.put_line(l_msg);
end;

答案 1 :(得分:0)

您需要在远程系统上启用DBMS_OUTPUT并手动获取线路:

如果在远程系统上有一个名为“ pr_remote ”的过程:

create or replace procedure pr_remote as  
begin    
  dbms_output.put_line('In remote procedure on:');    
  dbms_output.put_line('SERVER_HOST='||sys_context('userenv','SERVER_HOST'));  
  dbms_output.put_line('DB_NAME='||sys_context('userenv','DB_NAME'));  
end pr_remote;  

DB_LOCAL数据库中有一个数据库链接,可用于访问DB_REMOTE:

create database link **db_link_to_remote**
  connect to remote_user
  identified by remote_password
  using 'db_remote';

您需要启用远程DBMS_OUTPUT并使用循环获取每一行:

Declare
  /* how to get DBMS_OUTPUT from a remote system */
  sbLine    varchar2(1000);
  nuStatus  integer;
Begin
  Dbms_Output.Put_Line('My local is on         SERVER_HOST='||sys_context('userenv','SERVER_HOST')||'|DB_NAME='||sys_context('userenv','DB_NAME'));
  --
  Dbms_Output.Put_Line('Enable DBMS_OUTPUT remote');
  dbms_output.enable@db_link_to_remote;
  --
  Dbms_Output.Put_Line('Call remote procedure');
  pr_remote@db_link_to_remote;
  loop
     DBMS_OUTPUT.GET_LINE@db_link_to_remote(sbLine,
                                nustatus);
     --
     Dbms_Output.Put_Line(sbLine);
     exit when nustatus<>0;
  end loop;
  dbms_output.disable@db_link_to_remote;
End;