从 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 Collat​​ion 的参数已启用

感谢您的帮助

【问题讨论】:

可能有一些现代的方式,所以请原谅我问这些人,但这可以使用 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 '' ne peut être utilisée comme cible d'affectation ORA -06550:Ligne 1,colonne 53:PLS-00363:表达式 '0' ne peut être utilisée comme cible d'affectation ORA-06550:Ligne 1,colonne 7:PL/SQL:Statement ignored”。消息 7215,Niveau 17, État 1, Ligne 11 Impossible d'exécuter l'instruction sur le serverur distance 'DB_ORACLE'。 你能翻译一下吗? OLE DB 提供程序 "OraOLEDB.Oracle" "DB_ORACLE" 链接服务器返回消息 "ORA-06550: line 1, column 50: PLS-00363: expression " 'can not be used作为赋值目标 ORA-06550:第 1 行,第 53 列:PLS-00363:表达式 '0' 不能用作赋值目标 ORA-06550:第 1 行,第 7 列:PL / SQL:语句被忽略“。消息 7215 , Level 17, State 1, Line 10 无法在远程服务器'DB_ORACLE'上执行指令。我认为问题是OUTPUT参数【参考方案2】:

通过结果集传递输出变量应该可以工作:

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 中清除查询执行统计信息

从 MySql 迁移到 Sql server 2008

SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

将 SQL Server 2008 r2 降级到 SQL Server 2008

使用 Powershell 从 SQL Server 2008 R2 导出到固定宽度的文本文件