从 Sql Server 2008 执行 oracle 存储过程
Posted
技术标签:
【中文标题】从 Sql Server 2008 执行 oracle 存储过程【英文标题】:executing an oracle stored procedure from Sql Server 2008 【发布时间】:2015-08-28 04:42:01 【问题描述】:我正在尝试通过 DB LINK 从 SQL Server 2008 R8 执行 oracle 存储过程, 存储过程的头部是这样的:
程序测试(X OUT NOCOPY VARCHAR2,Y OUT NOCOPY NUMBER,Z IN NUMBER)
此过程将更新表“MYTABLE”并返回结果
我的 T-SQL 是:
DECLARE @X nvarchar(255)
DECLARE @Y INTEGER
DECLARE @Z INTEGER
SET @X= ''
SET @Y = 0
SET @Z = 2
EXEC('begin USER.PKG.TEST(?,?,?); end;',@X OUTPUT, @Y OUTPUT,@Z ) AT DB_ORACLE;
执行存储过程是因为我可以看到表“MYTABLE”已更新,但问题是我收到错误:
Msg 7215, Niveau 17, État 1, Ligne 10
Impossible d'exécuter l'instruction sur le serveur distant 'DB_ORACLE'.
翻译成
Cannot execute the instruction at the distant server 'DB_ORACLE'
注意:Rpc、Rpc Out 和 Use Remote Collation 的参数已启用
感谢您的帮助
【问题讨论】:
可能有一些现代的方式,所以请原谅我问这些人,但这可以使用 INSERT INTO remTble@DBlink VALUES ('stored proc call') 来完成,然后触发远程表执行存储的 proc 调用,在另一个表/UPDATE remTble 中返回结果,工作吗?我确定我以前在某个地方见过。 感谢您的回答,但问题是我无法编辑存储过程或向该表添加触发器,因为我无法控制 oracle 数据库/表。您必须将其视为使用 Web 服务,因此如果您是客户端,则无法编辑 Web 服务。 【参考方案1】:对于来自 SQL Server 的简单 Oracle 过程调用
exec ('begin sproc_name; end;') at linked_server_name
使用变量调用过程
<B>declare @z int<B>
<B>set @z = 10 <B>
exec ('begin sproc_name(''' + @z + '''); end;') at
linked_server_name;
这对我来说很好用 使用
【讨论】:
感谢您的回答,但该解决方案对我不起作用,我有一条附加错误消息:PLS-00363: expression '通过结果集传递输出变量应该可以工作:
DECLARE @X nvarchar(255) = '';
DECLARE @Y int = 0;
DECLARE @Z int = 2;
DECLARE @Result As Table (X nvarchar(255), Y int);
INSERT INTO @Result (X, Y)
EXEC('declare X nvarchar(255) = ?; Y int = ?; Z int = ?; begin USER.PKG.TEST(X, Y, Z); select X, Y from DUAL; end;', @X, @Y, @Z) AT DB_ORACLE;
SELECT @X = X, @Y = Y FROM @Result;
【讨论】:
以上是关于从 Sql Server 2008 执行 oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 上执行整个 .sql 文件
如何在 SQL Server 2005/2008 中清除查询执行统计信息
SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误