LONG的模糊查询的问题

oracle是强烈不建议使用LANG类型的,因为它有太多弊端,很不灵活,比如,我想LIKE 一个LANG字段,结果就会报错。但是oracle有些常用视图的字段就是用的LANG类型,如DBA_VIEWS的text字段。

如果我想用一般的方法去查看包含‘AAAA’文字的视图,会这样写:

SELECT * FROM dba_views t WHERE t.text LIKE '%AAAA%'

不过很不幸,对于LANG类型是不支持oracle的很多内置函数的,所以会报错

LONG的模糊查询的问题_第1张图片

今天看TOM的书,学到了一招,跟大家分享下,他利用dbms_sql包里面的一个将LANG类型转换为varchar类型的函数

CREATE OR REPLACE FUNCTION my_substr (p_view_name IN VARCHAR2,
                                      p_owner     IN VARCHAR2) RETURN VARCHAR2 IS
l_cursor  NUMBER := dbms_sql.open_cursor;
l_buffer   VARCHAR2(32765);
l_buffer_len NUMBER;
l_query    VARCHAR2(1000);
l_len      NUMBER;
BEGIN
  SELECT t.TEXT_LENGTH INTO l_len
    FROM user_Views t
    WHERE  t.VIEW_NAME=p_view_name;

  l_query := 'select text from user_Views where  VIEW_NAME=:VIEW_NAME';
  dbms_sql.parse(l_cursor,l_query,dbms_sql.native);
  --dbms_sql.bind_variable(l_cursor,'OWNER',p_owner);
  dbms_sql.bind_variable(l_cursor,'VIEW_NAME',p_view_name);
  dbms_sql.define_column_long(l_cursor,1);
  IF dbms_sql.execute_and_fetch(l_cursor)>0 THEN
    dbms_sql.column_value_long(l_cursor,1,4000,0,l_buffer,l_buffer_len);
  END IF;
  RETURN l_buffer;
END;
利用上面的函数就能将LANG字段里面的内容转换成varchar2类型,这样就能用like去模糊查询了

SELECT 1
  FROM (SELECT MY_SUBSTR('QQ', 'SYS') CON FROM DUAL) T
 WHERE T.CON LIKE '%TEST1%';



你可能感兴趣的:(oracle体系结构)