问题描述
嘿,
我想创造一个ultimate在文本视图中搜索正则表达式的过程。我听到你在玩长数据类型的时候喊“用球棒!”。但是在我的用户视图或ALL_VIEWS动态视图中,我不能转换数据类型,我真的想在视图中搜索。
我有第一个手术(我的really第一个步骤: D)和that works !!!
但只看"小"的观点。
I sadly can't deal with texts longer that 40000 chars.
我试着用这个有趣的声明:):
我想创造一个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字节的字符串,此操作无效。
http://www.oracle-developer.net/display.php?id=430
由于不想创建新表,因此可以:
-创建管道PL/SQL函数
-使用他的字典长应用程序实用程序
-使用DBMX_XMLGen将结果转换为XML。对于长度超过4,000字节的字符串,此操作无效。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




