从Sql Server 2008执行Oracle存储过程

5

我正在尝试通过DB LINK从SQL Server 2008 R8执行Oracle存储过程,存储过程的头部如下:

PROCEDURE TEST(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'.

That translate in

Cannot execute the instruction at the distant server 'DB_ORACLE'

注意:Rpc、Rpc Out 和 Use Remote Collation 的参数已启用。
感谢您的帮助。

也许有一些高端的现代方法,所以请原谅我问这个问题,但是可以使用 INSERT INTO remTble@DBlink VALUES ('stored proc call'),然后在远程表上创建一个触发器来执行存储过程调用,并将结果返回到另一个表/UPDATE remTble中吗?我确定我以前在某个地方看到过。 - TenG
谢谢您的回答,但问题是我无法编辑存储过程或向该表添加触发器,因为我没有对Oracle数据库/表的控制权。您必须将其视为使用Web服务,因此如果您是客户端,则无法编辑Web服务。 - aminedev
2个回答

0

针对从SQL Server调用简单的Oracle存储过程

在链接服务器名称处执行('begin sproc_name; end;')

使用变量调用存储过程

<B>declare @z int<B>
<B>set @z = 10 <B>
exec ('begin sproc_name(''' + @z + '''); end;') at 
linked_server_name;

这对我来说很好用 使用


谢谢您的回答,但是这个解决方案对我没有起作用,我还有一个额外的错误信息:PLS-00363:表达式'<null>'不能用作赋值目标 ORA-06550:第1行,第53列: PLS-00363:表达式'0'不能用作赋值目标 ORA-06550:第1行,第7列: PL/SQL:语句被忽略。 Msg 7215,Level 17,State 1,Line 11 无法在远程服务器“DB_ORACLE”上执行该命令。 - aminedev
你能翻译吗? - user2062108
OLE DB提供程序“OraOLEDB.Oracle”“DB_ORACLE”链接服务器返回消息“ORA-06550:第1行,第50列: PLS-00363:表达式“<null>”不能用作赋值目标 ORA-06550:第1行,第53列: PLS-00363:表达式“0”不能用作赋值目标 ORA-06550:第1行,第7列: PL/SQL:语句被忽略”。 Msg 7215,Level 17,State 1,Line 10 无法在远程服务器“DB_ORACLE”上执行指令。我认为问题在于输出参数。 - aminedev

0

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

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接