主要是使用链接服务器的方式
在Oracle SQL Developer建立链接服务器就不介绍了,网上也有很多教程
链接服务器的效果图如下图:
在Oracle端建立存储过程来调用sql server 的存储过程,sql脚本如下:
create or replace procedure obs.SynchronizeDiagnose_call
(in_EncounterId in number default -1)
as
c integer;
nr integer;
v_sql varchar2(32767);
begin
v_sql:='EXEC pHis30_SynchronizeDiagnose'||' '||to_char(in_EncounterId);
c:=DBMS_HS_PASSTHROUGH.OPEN_CURSOR@MZOP;
DBMS_HS_PASSTHROUGH.PARSE@MZOP(c,v_sql);
nr:=DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@MZOP(c);
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@MZOP(c);
dbms_output.put_line(nr);
commit;
end;
上面的@MZOP是链接服务器的名称,v_sql是要执行的sql语句,EXEC pHis30_SynchronizeDiagnose是sql server端的存储过程
调用如下:
begin
obs.SynchronizeDiagnose_call(443834);
end;
2020年11月3日更新:
今天看到同事用了一个更简单的方法:
1 链接服务器还是使用文章前面的那个
2 在Oracle这边直接调用sql server的存储过程
begin
pHis30_SynchronizeDiagnose@MZOP(4000);
commit;
end;
其中pHis30_SynchronizeDiagnose是sql server的存储过程名称,MZOP是链接服务器的名称,4000为输入的参数
不过要注意的是:如果sql server 的存储过程有更新表的操作,在oracle这边一定要commit,不然会锁住sql server的表(测试发现是表锁,而不是行锁)