【问题标题】:Dbms Output is not Displaying The Output in ToadDbms 输出未在 Toad 中显示输出
【发布时间】:2019-10-06 13:32:21
【问题描述】:

我执行了一个有 db 链接到其他 db 的过程,而 dbms 输出未显示输出。按钮为绿色。当我单击右键时,仅启用“Toogle 输出”和“轮询”。

【问题讨论】:

  • 尝试刷新屏幕(按下绿色箭头按钮,看起来像“回收”),或者关闭输出再打开几次。此外,在过程调用中包含一个字符串,例如dbms_output.put_line('the result is: ' || v_result); 所以它必须打印一些东西,即使v_result 是空的,所以你不可能看到任何东西。
  • 与db链接过程有关。如果我放 'dbms_output.put_line('xxx');'它打印“xxx”。但它不会在程序中打印行。
  • " 它打印 'xxx'" - 听起来你的程序有问题。您确定过程流沿着执行 DBMS_OUPUT 的路径前进吗?
  • 远程数据库上有dbms_output语句吗?

标签: sql oracle plsql toad dbms-output


【解决方案1】:

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

  • 有两个数据库,我们称它们为 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;

【讨论】:

    【解决方案2】:

    您需要在远程系统上启用 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;
    

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2011-04-02
      • 1970-01-01
      • 2012-04-04
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多