读书人

SQLSERVER2008调用ORACLE10G的存储过程

发布时间: 2012-12-21 12:03:49 作者: rapoo

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;'


--insert into #temp
exec (@ssqlA)

--select * from #temp



以上语句能够调用到ORACLE的存储过程了,但还是不能把存储过程执行出来的内容搞到SQL的临时表中,请大侠们继续指教!!


读书人网 >SQL Server

热点推荐