23c新特性之分布式LOB

OracleDatabase23c提升了对分布式和分片环境的LOB处理,包括临时LOB和内联LOB的支持。文章详细介绍了新版本中SQL和PL/SQL函数在远程LOB上的使用,以及一些限制条件。
摘要由CSDN通过智能技术生成

一 描述

1.1 Oracle 分布式LOB的介绍

从Oracle Database 23c开始,增强了对分布式和分片环境的 LOB 支持。分布式lob是从一个服务器获取到另一个服务器的lob,并且可以选择返回给客户端。共享lob是分布式lob的扩展,其中lob在分片之间或在分片与分片协调器之间传输。在以前的版本中,对分片lob和分布式lob的支持仅限于持久lob,而对临时lob的支持仅限于源于JSON操作的lob。现在,所有临时lob(包括Value lob)和新的增加长度的内联lob都可用作分布式lob和分片lob。现在可以在分布式和分片环境中使用内联lob、值lob和所有临时lob。在使用临时lob时,您可以体验到改进的性能、可伸缩性和垃圾收集,从而提高开发人员的生产力和应用程序的弹性。

1.2支持的SQL和PLSQL函数

只要嵌套函数返回的最终值不是LOB类型,所有在本地LOB和BFILEs上支持的SQL内置函数和用户定义函数在远程LOB和BFILEs上也受支持。这包括用于远程持久lob和临时lob以及bfile的函数。
在远程站点上执行的内置SQL函数可以是任何SQL语句的一部分。
例如:

SELECT LENGTH(ad_sourcetext) FROM print_media@remote_site – CLOB
SELECT LENGTH(ad_fltextn) FROM print_media@remote_site;   -- NCLOB
SELECT LENGTH(ad_composite) FROM print_media@remote_site; -- BLOB
SELECT product_id from print_media@remote_site WHERE LENGTH(ad_sourcetext) > 3;
UPDATE print_media@remote_site SET product_id = 2 WHERE LENGTH(ad_sourcetext) > 3;
SELECT TO_CHAR(foo@dbs2(...)) FROM dual@dbs2;
-- where foo@dbs2 returns a temporary LOB

允许在远程站点上执行并在远程LOB和bfile上操作的内置和用户定义的PL/SQL函数,只要嵌套函数返回的最终值不是LOB即可。
例如:

SELECT product_id FROM print_media@dbs2 WHERE foo@dbs2(ad_sourcetext, 'aa') > 0;
-- foo is a user-define function returning a NUMBER
DELETE FROM print_media@dbs2 WHERE DBMS_LOB.GETLENGTH@dbs2(ad_graphic) = 0;

1.2远程用户自定义功能限制

SQL和PL/SQL函数属于以下类别的非综合列表:
 lob上不支持的SQL函数
像DECODE函数这样不受lob支持的SQL函数在远程lob上也不受支持。
 只接受一个LOB参数(其中所有其他参数都是非LOB数据类型)并且不返回LOB的函数
支持像LENGTH函数这样的函数。
例如:

SELECT LENGTH(ad_composite) FROM print_media@remote_site;
SELECT LENGTH(ad_header.logo) FROM print_media@remote_site; -- LOB in object
SELECT product_id from print_media@remote_site WHERE LENGTH(ad_sourcetext) > 3;

 返回LOB的函数
这些函数可能会返回原始 LOB 或生成临时 LOB。只要返回到本地站点的结果不是 LOB,就可以在远程站点上执行这些功能。
返回临时LOB的函数有:REPLACE, SUBSTR, CONCAT, ||, TRIM, LTRIM, RTRIM, LOWER, UPPER, NLS_LOWER, NLS_UPPER, LPAD, and RPAD.
返回原始LOB定位器的函数有:NVL, DECODE, and CASE.

例如:
支持以下语句:

SELECT TO_CHAR(CONCAT(ad_sourcetext, ad_sourcetext)) FROM print_media@remote_site;
SELECT TO_CHAR(SUBSTR(ad_fltextnfs, 1, 3)) FROM print_media@remote_site;

不支持以下语句:

SELECT CONCAT(ad_sourcetext, ad_sourcetext) FROM print_media@remote_site;
SELECT SUBSTR(ad_sourcetext, 1, 3) FROM print_media@remote_site;

 在lob上运行的PL/SQL函数:
一个dblink中的函数不能对另一个dblink中的LOB数据进行操作。
例如,不支持以下语句:

SELECT a.product_id FROM print_media@dbs1 a, print_media@dbs2 b WHERE 
CONTAINS@dbs1(b.ad_sourcetext, 'aa') >0;

 查询块中的多个lob:
一个查询块不能同时包含表和函数。
例如,不支持以下语句:

SELECT a.product_id FROM print_media@dbs2 a, print_media@dbs3 b
    WHERE CONTAINS@dbs2(a.ad_sourcetext, 'aa') > 0 AND
    foo@dbs3(b.ad_sourcetext) > 0;
--  foo is a user-defined function in dbs3

 如果LOB操作符和列位于SELECT列表和连接查询中的where子句中,则支持它们。
 oracle提供的PL/SQL函数和过程可以返回LOB定位器。
 只有远程lob支持返回临时lob的SQL操作符。
 只有Oracle提供的视图支持返回lob。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值