日期:2014-05-17  浏览次数:20446 次

SQLSERVER2008调用ORACLE10G的存储过程的问题
本帖最后由 pensheng 于 2012-11-06 17:11:31 编辑 --以下语句为在 oracle10g 中创建
create table EMP (SAL number(5),salname varchar2(50),salary number(5))

insert into EMP (SAL,salname,salary) values(1,'张三',2800);
insert into EMP (SAL,salname,salary) values(2,'李四',1900);
insert into EMP (SAL,salname,salary) values(3,'王五',5400);
insert into EMP (SAL,salname,salary) values(4,'ABC',3400);

CREATE OR REPLACE PROCEDURE gettest(eNo NUMBER)   AUTHID  CURRENT_USER    --参数的数据类型不能指定长度
AS
salary emp.sal%TYPE;
BEGIN
  SELECT salary INTO salary  FROM EMP WHERE SAL=eNo;
  DBMS_OUTPUT.PUT_LINE(eNo||'号员工的工资为'||salary);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END;

 --当过程中含有输出参数时,调用时必须通过BEGIN  END块,不能通过EXEC或CALL调用。如:
BEGIN
  scott.gettest(3);
END;

以上语句在ORACLE10g 的服务端和客户端的 SQLPLUS均能执行成功,但在SQLSERVER中建立链接服务器后调用存储过程不成功,但调用查询是成功的。如下图,哪位高手给指点一下。权限是肯定有的,我用的sysman权限做的链接服务器(图片语句为在 SQLSERVER2008 中执行)



------最佳解决方案--------------------
--开启xp_cmdshell
--SQL Server blocked access to procedure 'xp_cmdshell'
sp_configure 'show advanced options', 1
go
reconfigure
go
sp_configure 'xp_cmdshell', 1
go
reconfigure
go

--开启sp_OACreate
--SQL Server blocked access to procedure 'sys.sp_OACreate'
sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'ole automation procedures', 1;
go
reconfigure;
go


sp_configure 'Ad Hoc Distributed Queries',1;
go
reconfigure
go

------其他解决方案--------------------
在SQL SERVER中 需要开启高级选项。
------其他解决方案--------------------
帮顶~
------其他解决方案--------------------
连接服务器rpc out设置为true
------其他解决方案--------------------
感谢版主回贴,我试一下,不过今天出差了,环境在公司机器上,估计得晚点结贴,希望版主不要见怪。
------其他解决方案--------------------
版主你好,我刚才让同事按你说的测试了,调用查询成功,调用存储过程还是报一样的错,会不会是我的权限没设置对?但我99%确定我是设了权限的 。 我用 grant 赋过权限了,赋的是 dba 权限给用户
------其他解决方案--------------------
引用:
连接服务器rpc out设置为true


感谢兄弟回答,已经设置成了TRUE ,还是不行
------其他解决方案--------------------
创建读取HIS数据并写入的临时表
if OBJECT_ID('tempdb.dbo.#temp') is not null 
drop table #temp
create table #temp (no  varchar(50))

--把HIS取得的摆药数据插入到临时表中
set xact_abort ON
declare @ssqlA varchar(3000)
set @ssqlA='exec (''
DECLARE
salarytwo  varchar2(50);salnametwo varchar2(50);
BEGIN
  gettesttwo(1,salarytwo,salnametwo);
  DBMS_OUTPUT.PUT_LINE(salarytwo);
  DBMS_OUTPUT.PUT_LINE(salnametwo);
END;'') AT testtwo;'