我想比较Oracle中的text(LONG)
FROM user_views
字典视图与用户创建的表all_views_backup
中的text(CLOB)
。
类似于:
CREATE TABLE all_views_backup AS
SELECT view_name, text_length, to_lob(text) AS text
FROM user_views;
SELECT dbms_lob.compare(to_lob(uv.text),avb.text)
FROM all_views_backup avb
JOIN user_views uv
ON avb.view_name = uv.view_name;
表创建成功。
结果应该是1为文本的差异和0为相同的,但在查询我得到了错误
ORA-00932: inconsistent datatypes: expected - got LONG.
帮我一下
谢谢
1条答案
按热度按时间8wigbo561#
要使用LONG,你需要PL/SQL。这将把一个LONG列的值放入一个CLOB:
然后,你可以对CLOB使用所有你想要的字符串操作和/或比较运算符/函数。在此基础上,你可以编写代码来进行你想要做的比较。这是最简单的方法。
如果你想在
all_views
的顶部创建一个 view,它显示all_views
的内容,但TEXT
字段是CLOB而不是LONG,你需要dbms_sql
来实现这一点。为了在这种情况下将LONG转换为CLOB,你可以使用dbms_lob.createtemporary
,在dbms_sql.column_value_long
上循环,并使用dbms_lob.append
将内容附加到临时CLOB。下面是我的dba_views
覆盖视图的摘录,它正是这样做的。作为摘录,它不能按原样使用,但它是一个更大的函数的一部分,该函数操作dbms_sql
,但它至少提供了概念: