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

Sql 通过数据库链接在oracle中调用存储函数(返回用户定义类型的数组),sql,database,oracle,database-connection,Sql,Database,Oracle,Database Connection,通常,我这样调用我的函数: SELECT * FROM TABLE( package_name.function(parameters) ) 我试图通过数据库链接调用此函数。我的直觉是,以下是正确的语法,但我还没有让它工作: SELECT * FROM TABLE( package_name.function@DBLINK(parameters) ) > ORA-00904: "PACKAGE_NAME"."FUNCTION": invalid identifier 我试

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

SELECT * 
FROM TABLE(
  package_name.function(parameters)
)
我试图通过数据库链接调用此函数。我的直觉是,以下是正确的语法,但我还没有让它工作:

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

> ORA-00904: "PACKAGE_NAME"."FUNCTION": invalid identifier
我试着绕过数据库链接,但没有效果。我试过把它放在参数列表之后,最后一个括号之后,包名之后……我还试过上面所有的排列,包括包名之前的模式名。我的点子快用完了

这是oracle 10g。我怀疑这个问题可能是函数的返回类型没有在我调用它的模式中定义,但是我觉得如果是这样的话,我应该得到一个不同的错误


谢谢你的帮助

据我所知,您尝试的是正确的语法,但无论如何它都不会工作,因为返回类型是用户定义的,正如您所怀疑的那样

下面是一个内置流水线函数的示例。当然,将其称为本地产品是可行的:

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没有帮助(相同的错误)。有什么建议的解决方法吗?目前我最好的想法是使用视图将函数包装到远程数据库中。请参阅编辑后的答案。也许更好的方法是在远程中创建一个全局临时表,调用远程函数将请求的行加载到该表中,然后查询它。我想到的最佳解决方法正是您的上述注释,但对我来说,重建视图比截断和重新填充表更有吸引力。在任何情况下,我都会为您提出的解决方案提供一个“已接受”的选项。谢谢!没问题。仅供参考,全局临时表不需要被截断——它会自动为使用它的每个事务(或会话,取决于创建方式)保留一组单独的行。