答案 0 :(得分:0)
如果我理解正确,它就是这样的:
有一个驻留在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;