暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle all_views视图中的长数据类型

askTom 2016-02-01
195

问题描述

嘿,

我想创造一个ultimate在文本视图中搜索正则表达式的过程。我听到你在玩长数据类型的时候喊“用球棒!”。但是在我的用户视图或ALL_VIEWS动态视图中,我不能转换数据类型,我真的想在视图中搜索。

我有第一个手术(我的really第一个步骤: D)和that works !!!
但只看"小"的观点。
DECLARE
  --terme a rechercher en regexp
  rechercher varchar2(200) := 'Le FOOBAR';
  --modificateurs regex
  modifiers varchar2(200) := 'i';
  --nb de caractère autour de la pos des termes trouvés
  --Mettre 50 renverra 100 caractères par trouvailles
  gap number := 8;

  --caches de la requêtes
  text long;
  text2 long;
  --curseur de recherche
  inst number;
  --numero de ligne ou trouvé
  ln number;
  --True si on a trouvé, continue de chercher tant qu'on trouve
  continue boolean;
  --entetes déjà affichés
  entete boolean;
  --occurence recherchée
  occurence number;
  --Numero de la partie
  npart number;
  --Si true : plus d'outputs
  debug boolean:=false;
BEGIN
--/*
  DBMS_OUTPUT.put_line('Recherche de "'||rechercher||'"');
  --On recherche dans les vues 'courtes'
    IF(debug=true) then DBMS_OUTPUT.put_line('DEBUG:LOOPSHORT'); end if;

  for sql_query in (
    SELECT VIEW_NAME FROM USER_VIEWS where text_length<=40000
  )
  LOOP
    IF(debug=true) then DBMS_OUTPUT.put_line('DEBUG:LOOPSHORT:'||sql_query.view_name); end if;

    --recup de la requête de la vue courante
    SELECT TEXT INTO TEXT FROM USER_VIEWS WHERE VIEW_NAME=SQL_QUERY.VIEW_NAME;

    IF(debug=true) then DBMS_OUTPUT.put_line('DEBUG:LOOPSHORT:'||sql_query.view_name||':CLEANING'); end if;
    --Suppression des commentaires
    text := regexp_replace(text, '--[^\'||chr(10)||']*\'||chr(10)||'',chr(10));
    text := regexp_replace(text, '/\*.*?\*'||'/','');

    --initialisation de la recherche
    occurence:=1;  continue:=true;  entete:=true;

    IF(debug=true) then DBMS_OUTPUT.put_line('DEBUG:LOOPSHORT:'||sql_query.view_name||':RECHERCHE'); end if;

    --Recherche
    WHILE continue=true LOOP
      inst := regexp_INSTR(text,rechercher,1,occurence, 0, modifiers);
      IF --si on trouve
        inst!=0
      THEN
        IF
          (entete=true)
        THEN
          DBMS_OUTPUT.put_line(chr(10)||
          '> >>'
            ||sql_query.view_name||':'
          );
          entete:=false;
        END if;
        --on compte le nombre de sauts de lignes dans la requête jusqu'au point trouvé
        ln:=length(regexp_replace(substr(text, 1,inst),'[^'||chr(10)||']',''));

        --On commence a découper et formatter la sortie
        text2:=substr(text, greatest(1,inst-gap), gap*2 );
        text2:=regexp_replace(text2,'['||chr(10)||'\'||chr(9)||'\ ]+',' ');
        DBMS_OUTPUT.put_line(
          '> >>l.'
          ||(ln+1)||':'||text2||chr(10)
          ||lpad('^', regexp_INSTR( text2,rechercher,gap/2,1,0,'i')+7+length((ln+1)||''), ' ')
          --||inst
        );
        occurence:=occurence+1;
        ELSE
          continue:=false;
      END IF;--/si on trouve
    END LOOP;
    IF(debug=true)
     then DBMS_OUTPUT.put_line('DEBUG:LOOPSHORT:END:'||sql_query.view_name);
    end if;
  END LOOP;
  IF(debug=true)
    then DBMS_OUTPUT.put_line('DEBUG:END:LOOPSHORT');
   end if;


--*/

END;
/


I sadly can't deal with texts longer that 40000 chars.
我试着用这个有趣的声明:):
SELECT 
    level,
    text_length,
    substr(TEXT, (level-1)*20000, 39999) text
  from (
    select 
        TEXT,
        text_length 
      FROM USER_VIEWS 
    WHERE 
       text_length<=40000
  ) 
  connect by (level-1)*40000

但是服务器的反应:(:
          substr(TEXT, (level-1)*20000, 39999) text
                 *
ERREUR a la ligne 108 :
ORA-06550: Ligne 108, colonne 18 :
PL/SQL: ORA-00932: types de donnees incoherents ; attendu : CHAR ; obtenu : LONG
ORA-06550: Ligne 105, colonne 7 :
PL/SQL: SQL Statement ignored
...

类似于英语中的“不一致的数据类型,应为:字符;获取:长”


I don't wan't to use any temporary table.

希望你有什么解决办法。

谢谢你,
来自法国的爱,西里尔。

专家解答

阿德里安·比林顿在以下网站上介绍了处理多头问题的多种方法:

http://www.oracle-developer.net/display.php?id=430

由于不想创建新表,因此可以:

-创建管道PL/SQL函数
-使用他的字典长应用程序实用程序
-使用DBMX_XMLGen将结果转换为XML。对于长度超过4,000字节的字符串,此操作无效。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论