oracle 通过dblink获取存储过程的clob输出

qmelpv7a  于 2023-02-18  发布在  Oracle
关注(0)|答案(2)|浏览(359)

我有一个过程,它对几个表运行查询,并将输出操作到它返回的clob中。我需要通过dblink在远程数据库中调用此过程,并获取该过程返回的clob值。我知道我们无法通过dblink访问像clob这样的非标量数据。我知道如果clob位于远程端的表中,我可以只创建一个全局临时表,然后在本地端通过选择远程表来插入本地临时表,但在我的例子中,clob是过程的操作输出。
我该怎么做有什么建议吗?

7jmck4yq

7jmck4yq1#

在远程数据库上,创建一个函数来 Package 该过程,并将CLOB作为其返回值返回。然后创建一个视图,该视图从该函数中进行选择,并将CLOB作为列公开。您应该能够通过数据库链接通过视图远程查询该CLOB列。我知道这可以工作,因为我在我编写的实用程序中每天都要通过数据库链接数千次拉取CLOB数据。虽然我记得它采取了一点试错,使它高兴。
如果您无法实现这一点,还有许多其他的解决方法。一种方法是使用一个远程包,该远程包提供包声明的集合类型,该包中的远程函数可以使用该集合类型将CLOB反汇编为varchar 2的集合(32767)记录,将该集合返回到调用数据库,然后使用remote reference @dblink指向该远程包的类型,就能够从集合内容重新组装本地CLOB,但是这种繁重的工作方法实际上是没有必要的。
最后,我至少应该提到,对结构化数据使用CLOB不是一个好的设计选择,CLOB应该只包含非结构化数据,即只对人类有意义的数据(如日志文件,自由形式的注解,用户输入的描述,它永远不应该用于组合程序要解释和使用的多个有意义的结构化数据。有许多其他的结构可以比CLOB更好地处理这个问题。

6ie5vjzr

6ie5vjzr2#

我认为应该将该CLOB拆分为varchar2的块(4000),并存储到具有保留行临时表中,以便通过该DB链接,您将仅从包含CLOB块和指示其顺序的列的表中进行选择。这将意味着在该远程DB中创建一个过程,该过程调用生成CLOB的过程,然后将CLOB拆分为块并将它们插入全局临时表。

相关问题