我试图在用于创建materialisd视图的脚本中搜索关键字CUSTOMER
。我是通过搜索表all_mviews
的QUERY
列来实现这一点的。所以理论上
SELECT *
FROM ALL_MVIEWS
WHERE UPPER(QUERY) LIKE '%CUSTOMER%';
应该可以但是,因为查询不是CHAR数据类型,所以我不能这样做。我试过使用TO_CHAR(QUERY)
,DMBS_LOB.INSTR(QUERY, 'CUSTOMER')
,TO_LOB(QUERY)
。似乎什么都不管用。理想情况下,我想用普通SQL而不是PL/SQL来做这件事。
2条答案
按热度按时间k4ymrczo1#
你当然可以在普通SQL中查询,但是你将无法摆脱在幕后使用PL/SQL。这是因为LONG只能由PL/SQL操作。
要实现这一点,您必须编写一个PL/SQL函数,该函数 Package 有问题的字典视图(这里是
all_mviews
),将LONG
数据类型转换为CLOB
,并发出替换行。然后,您可以使用纯SQL查询查询该函数,并像往常一样对其应用搜索 predicate 。下面是一个用于19 c中可用列的版本:现在你可以简单地使用常规SQL查询:
同样的技术也可以用于
dba_views
。对于其他更短的LONG
,永远不会超过4KB,就像你在dba_tab_partitions/subpartitions
,dba_tab_columns
,dba_ind_expressions
等中找到的那样。您可以通过将LONG
转换为varchar2(4000)
来简化,这可以通过简单的PL/SQL变量赋值来完成,因此不需要dbms_sql
。这段代码要短得多,但同样的原则适用:使用PL/SQL转换为可搜索的数据类型,并使用 Package 该函数的替换视图。whlutmcx2#
LONG
数据类型在SQL中使用时有很多限制,因此不能直接将任何函数应用于LONG
,也不能使用任何 predicate ,但null测试除外(尽管 *Oracle Corporation强烈建议将LONG列转换为LOB列 * 至少从版本8.2开始(24年),并 * 尽快 * 从版本9.2开始(21年),但他们仍然在数据字典中保留此类型)。但是可以通过XML传递此数据类型并反序列化为
CLOB
,这将允许暴露CLOB
的所有SQL功能。你可以使用DBMS_XMLGEN
包来实现。| 所有者|查看_名称|正文|文本_长度|
| - -----|- -----|- -----|- -----|
| FIDDLE_SHCEJNRFMOROSMIQCFFB| V_TEST|选择'some text'作为res关于Dual|三十五|
fiddle