在 SQL Server 上为 Oracle 存储过程使用同义词

Posted

技术标签:

【中文标题】在 SQL Server 上为 Oracle 存储过程使用同义词【英文标题】:Use a Synonym on SQL Server for an Oracle Stored Procedure 【发布时间】:2016-03-10 16:58:38 【问题描述】:

是否可以在 SQL Server 中使用同义词在链接的 Oracle 服务器中执行存储过程?

我知道我可以直接执行SP,下面的语句可以正常工作:

EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer];

但我希望能够使用同义词,这样如果链接服务器名称发生更改,我就不必更新所有代码,只需更新同义词。我创建了这样的同义词:

CREATE SYNONYM dbo.ORA_PROC1 FOR [LinkedOracleServer]..[MYSCHEMA].[PROCEDURE1];

同义词已正确创建,但使用 EXECUTE dbo.ORA_PROC1 调用它会返回错误消息:

链接服务器“LinkedOracleServer”的 OLE DB 提供程序“OraOLEDB.Oracle”返回消息“未指定错误”。 消息 7323,第 16 级,状态 2,第 1 行 向链接服务器“LinkedOracleServer”的 OLE DB 提供程序“OraOLEDB.Oracle”提交查询文本时出错。

仅供参考,链接服务器上的表的同义词可以正常工作,那么为什么不使用存储过程呢?

CREATE SYNONYM ORA_TABLE1 FOR [LinkedOracleServer]..[MYSCHEMA].[TABLE1];
GO
SELECT * FROM ORA_TABLE1;

编辑

经过进一步测试,我发现

EXECUTE [LinkedOracleServer]..[MYSCHEMA].[PROCEDURE1]

返回与上面完全相同的错误。所以问题不一定出在同义词本身,而在于执行该过程的语法。

【问题讨论】:

请包含错误信息 @JonathonOgden 完成。 (总是好的建议!) 为了清楚起见,您可以直接执行您的这个SP,而不是通过同义词? (在您的开幕式中,我似乎还不够清楚) @JonathonOgden 是的,问题中的第一个执行语句按预期工作。 您可以在当前数据库中创建一个存储过程来执行操作EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer]; 【参考方案1】:

您可以在本地数据库中创建一个存储过程来执行操作

`EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer];`

这将解决在链接的 Oracle 服务器上直接执行存储过程的错误,同时仍然掩盖确切的执行语言。

【讨论】:

以上是关于在 SQL Server 上为 Oracle 存储过程使用同义词的主要内容,如果未能解决你的问题,请参考以下文章

sql server 怎么服务器连接调用oracle的存储过程

是否可以在 Microsoft SQL Server 上为 SQL 查询设置超时?

是否可以在Microsoft SQL Server上为SQL查询设置超时?

调用使用 Microsoft SQL Server 的输出参数的 Oracle 存储过程

我如何在 Oracle 的 SQL Developer 20.2 上为 11g 数据库注册小时数?

从 Sql Server 2008 执行 oracle 存储过程