当前位置: 首页 > 面试题库 >

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

施飞雨
2023-03-14
问题内容

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

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;

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



 类似资料:
  • 我在包规格中有记录类型: 和返回此类型的函数。我正在使用MyBatis与Spring的集成。如何调用(使用MyBatis XML映射器)这个函数并将结果映射到POJO对象?

  • 问题内容: 编辑:虽然此问题中的某些答案可能会帮助其他人解决不同的问题,但该解决方案实际上与数据库连接上的自动提交功能中的某些错误有关! 执行查询后强制执行提交会使数据库反映更改,因此下面显示的代码是调用此类型存储过程的正确方法 我正在尝试在oracle数据库中调用一个简单的存储过程。 该过程如下所示: 我遇到麻烦的Java代码如下所示 我根本没有收到任何错误,但是没有反映出数据库更改。当我在SQ

  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作:

  • 我对卡桑德拉的数据建模有一个疑问,希望能在这里提出一些建议。 我们正在尝试构建一个多租户应用程序,我们希望数据结构由用户定义。用户可以定义数据源、字段数量、数据类型、顺序等,然后基于此结构上载数据。既然Cassandra不支持混合数据类型列表,我们如何在Cassandra之上设计这样的应用程序呢。当前集合类型为映射(相同类型)/集/列表(相同类型)。此外,是否可以基于用户定义的实体查询数据? 目前

  • 问题内容: 我想了解为什么下面的代码片段无法编译。将函数接受为可能具有任何返回类型的函数参数的Go方法是什么? 播放:https://play.golang.org/p/CqbuEZGy12 我的解决方案基于Volker的答案: 播放:https://play.golang.org/p/waOGBZZwN7 问题答案: 你绊倒了围棋新人一个非常普遍的误解:空接口并 不能 意味着“任何类型”。确实不

  • 问题内容: 我正在尝试获取返回值,但始终无法定义。 我不确定如何获取任何返回值并在其他地方使用它?我需要使用此返回值来与其他函数进行验证,但是它似乎在范围之内。 这是我的代码: 问题答案: 移动以下行: 进入回调: 如果希望返回某些内容,则还需要向其添加回调,以便可以使用它的返回值。例如,如果您希望这样做: 这将无法正常工作,因为内容的最终值将被异步检索。相反,您需要这样做: 您不能异步返回数据。