oracle 如何比较LONG数据类型和CLOB

6xfqseft  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(294)

我想比较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.

帮我一下
谢谢

8wigbo56

8wigbo561#

要使用LONG,你需要PL/SQL。这将把一个LONG列的值放入一个CLOB:

DECLARE
  var_clob clob;
BEGIN
  FOR rec_view IN (SELECT * FROM all_views)
  LOOP
     var_clob := rec_view.text;
  END LOOP;
END;

然后,你可以对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,但它至少提供了概念:

DECLARE
  var_text_clob clob;
  var_offset pls_integer := 0;
  var_buffer_length pls_integer := 32760;
  var_value_length pls_integer := 0;
  var_long_piece long;
BEGIN
  dbms_lob.createtemporary(var_text_clob, false, dbms_lob.call);
    
  LOOP
    dbms_sql.column_value_long(c => var_cursor,
                               position => 4,
                               length => var_buffer_length,
                               offset => var_offset,
                               value => var_long_piece,
                               value_length => var_value_length);
                               
    EXIT WHEN var_value_length = 0;
    
    dbms_lob.append(var_text_clob, var_long_piece);
    var_offset := var_offset + var_value_length;
  END LOOP;
  
  rec_view.text := var_text_clob;
END;

相关问题