在 SQL 服务器上为 Oracle 存储过程使用同义词
Use a Synonym on SQL Server for an Oracle Stored Procedure
是否可以在 SQL 服务器中使用同义词在链接的 Oracle 服务器中执行存储过程?
我知道我可以直接执行SP,下面的语句是正确的:
EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer];
但我希望能够使用同义词,这样如果链接的服务器名称发生变化,我就不必更新我的所有代码,只需更新同义词。我创建了一个同义词,如下所示:
CREATE SYNONYM dbo.ORA_PROC1 FOR [LinkedOracleServer]..[MYSCHEMA].[PROCEDURE1];
已正确创建同义词,但使用 EXECUTE dbo.ORA_PROC1
returns 调用它时出现错误消息:
OLE DB provider "OraOLEDB.Oracle" for linked server "LinkedOracleServer" returned message "Unspecified error".
Msg 7323, Level 16, State 2, Line 1
An error occurred while submitting the query text to OLE DB provider "OraOLEDB.Oracle" for linked server "LinkedOracleServer".
仅供参考,链接服务器上表的同义词工作正常,那么为什么不使用存储过程?
CREATE SYNONYM ORA_TABLE1 FOR [LinkedOracleServer]..[MYSCHEMA].[TABLE1];
GO
SELECT * FROM ORA_TABLE1;
编辑
经过进一步测试,我发现
EXECUTE [LinkedOracleServer]..[MYSCHEMA].[PROCEDURE1]
returns 与上面完全相同的错误。所以问题不一定出在同义词本身,而是出在执行该过程的语法上。
您可以在本地数据库中创建一个存储过程来执行操作
`EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer];`
这将解决直接在链接的 Oracle 服务器上执行存储过程的错误,同时仍然屏蔽确切的执行语言。
是否可以在 SQL 服务器中使用同义词在链接的 Oracle 服务器中执行存储过程?
我知道我可以直接执行SP,下面的语句是正确的:
EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer];
但我希望能够使用同义词,这样如果链接的服务器名称发生变化,我就不必更新我的所有代码,只需更新同义词。我创建了一个同义词,如下所示:
CREATE SYNONYM dbo.ORA_PROC1 FOR [LinkedOracleServer]..[MYSCHEMA].[PROCEDURE1];
已正确创建同义词,但使用 EXECUTE dbo.ORA_PROC1
returns 调用它时出现错误消息:
OLE DB provider "OraOLEDB.Oracle" for linked server "LinkedOracleServer" returned message "Unspecified error".
Msg 7323, Level 16, State 2, Line 1
An error occurred while submitting the query text to OLE DB provider "OraOLEDB.Oracle" for linked server "LinkedOracleServer".
仅供参考,链接服务器上表的同义词工作正常,那么为什么不使用存储过程?
CREATE SYNONYM ORA_TABLE1 FOR [LinkedOracleServer]..[MYSCHEMA].[TABLE1];
GO
SELECT * FROM ORA_TABLE1;
编辑
经过进一步测试,我发现
EXECUTE [LinkedOracleServer]..[MYSCHEMA].[PROCEDURE1]
returns 与上面完全相同的错误。所以问题不一定出在同义词本身,而是出在执行该过程的语法上。
您可以在本地数据库中创建一个存储过程来执行操作
`EXECUTE ('BEGIN PROCEDURE1; END;') AT [LinkedOracleServer];`
这将解决直接在链接的 Oracle 服务器上执行存储过程的错误,同时仍然屏蔽确切的执行语言。