通过数据库链接在 oracle 中调用存储函数(返回用户定义类型的数组)

Posted

技术标签:

【中文标题】通过数据库链接在 oracle 中调用存储函数(返回用户定义类型的数组)【英文标题】:Calling a stored function (that returns an array of a user-defined type) in oracle across a database link 【发布时间】:2011-08-30 15:50:01 【问题描述】:

通常,我这样调用我的函数:

SELECT * 
FROM TABLE(
  package_name.function(parameters)
)

我正在尝试通过数据库链接调用此函数。我的直觉是以下是正确的语法,但我还没有让它工作:

SELECT * 
FROM TABLE(
  package_name.function@DBLINK(parameters)
)

> ORA-00904: "PACKAGE_NAME"."FUNCTION": invalid identifier

我试过移动数据库链接,但没有效果。我试过把它放在参数列表之后,最后一个括号之后,包名之后......我还尝试了上述所有排列,包括包名之前的模式名。我的想法不多了。

这是 oracle 10g。我怀疑问题可能是函数的返回类型未在我调用它的架构中定义,但如果是这种情况,我觉得我应该得到一个不同的错误。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

据我所知,您正在尝试的是正确的语法,但无论如何,由于返回类型是用户定义的,因此它不起作用,正如您所怀疑的那样。

这是一个带有内置流水线函数的示例。当然,在本地调用它是有效的:

SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'));

返回:

SQL_ID: a, child number: 1 cannot be found 

通过数据库链接调用它:

SELECT * FROM TABLE(dbms_xplan.display_cursor@core('a',1,'ALL'));

失败并出现此错误:

ORA-30626: function/procedure parameters of remote object types are not supported

您可能会收到 ORA-904,因为该链接指向一个无法访问该包的特定模式。但无论如何,即使您在本地架构中定义了具有相同名称的相同类型,这也不起作用,因为从 Oracle 的角度来看,它们仍然不是同一类型。

您当然可以远程查询视图,因此如果有一组明确定义的可能参数,您可以为每个参数组合创建一个视图,然后进行查询,例如:

CREATE VIEW display_cursor_a_1_all AS
  SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'))
  ;

如果可能的参数值范围太大,您可以创建一个过程,在给定任何参数集的情况下动态创建所需的视图。那么你每次要执行查询时都有一个两步过程:

EXECUTE  package.create_view@remote(parameters)

SELECT * FROM created_view@remote;

然后您必须考虑多个会话是否可以并行调用,如果可以,如何防止它们相互踩踏。

【讨论】:

好吧,我已经确认在第二个模式中创建 UDT 没有帮助(同样的错误)。有任何建议的解决方法吗? 我目前最好的想法是使用视图将函数包装在远程数据库中。请参阅编辑后的答案。 也许更好的办法是在远程创建一个全局临时表,调用一个远程函数将请求的行加载到该表中,然后查询它。 我想出的最佳解决方法正是您上面的评论,但重建视图比截断和重新填充表格更吸引我。无论如何,我会给你一个“接受”你提出的解决方法。谢谢! 没问题。仅供参考,不需要截断全局临时表——它会自动为使用它的每个事务(或会话,取决于它的创建方式)保留一组单独的行。

以上是关于通过数据库链接在 oracle 中调用存储函数(返回用户定义类型的数组)的主要内容,如果未能解决你的问题,请参考以下文章

求助如何通过dblink调用另一个数据库函数的相关推荐

如何通过数据库链接执行 Oracle 存储过程

如何在ORACLE存储过程中调用WEBSERVICE函数

oracle函数和存储过程有什么区别

Oracle学习笔记

oracle面试题