通常,我这样调用我的函数:
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;
然后,您必须考虑多个会话是否可以并行调用此方法,如果需要,则如何防止它们相互踩踏。