一 描述
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。