Вывод дБмс не отображает вывод в жабе - PullRequest
1 голос
/ 20 мая 2019

Я выполняю процедуру, которая имеет ссылку на БД на другой выход БД, а вывод БД не отображает вывод.Кнопка зеленая.Когда я нажимаю вправо, включаются только «Вывод в Google» и «Опрос».

image

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Вам необходимо включить 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;
0 голосов
/ 20 мая 2019

Если я правильно понял, вот как это происходит:

  • есть две базы данных, назовем их 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;
...