用oracle sql中的特殊字符替换HTML代码的有效方法

时间:2014-03-14 07:04:57

标签: sql regex oracle replace oracle11g

3 个答案:

答案 0 :(得分:3)

您想使用UTL_I18N.unescape_reference

为了不编写长脚本,让Oracle为您完成工作。然后运行其生成的脚本:

select
   'UPDATE ' || table_name || ' SET ' || col_name || ' = UTL_I18N.unescape_reference(' || col_name || ');'
from
   all_tab_cols
where
   owner = <MY_NAME>
and 
   table_name in ('....') -- you can use this clause too: table_name like '%my_table%'

答案 1 :(得分:1)

您可以创建一个过程,将UPDATE语句假脱机到一个文件中,您最终可以执行该过程来执行实际更新。

步骤将涉及以下内容:

  1. 创建一个临时表,其中包含两列,用于存储HTML代码和显示值映射。
  2. 创建一个使用游标执行此逻辑的过程:
    • 遍历所有要更新的表格。
    • 对于每个表,标识user_tab_columns或all_tab_columns中的列。
    • 对于每一列,循环遍历#1中创建的临时表中的HTML代码,然后创建一个UPDATE语句,该语句将列值HTML代码替换为其对应的显示值。
    • 将每个UPDATE语句输出到控制台。
  3. 执行该过程并将结果假脱机到文件
  4. 执行假脱机文件作为脚本运行UPDATE语句。
  5. 实际步骤可能与上述步骤不同。但我们的想法是通过创建一个自动创建必要的UPDATE语句的过程来加速任务。

答案 2 :(得分:0)

行。现在我找到了一个解决方案来创建here所述的函数。上述两个答案都对此有用。

选项1:

CREATE OR REPLACE FUNCTION STRIP_HTML ( DIRTY    IN VARCHAR2,
                                        TO_CVS   IN NUMBER DEFAULT 0 )
   RETURN VARCHAR2
IS
   OUT                   CLOB;

   TYPE ARR_STRING IS VARRAY ( 38 ) OF VARCHAR2 ( 64 );

   ENTITIES_SEARCH_FOR   ARR_STRING;
   ENTITIES_REPLACE      ARR_STRING;
   CONT                  NUMBER;
BEGIN
   -- to accelerate the issue
   IF DIRTY IS NULL
   THEN
      RETURN DIRTY;
   END IF;                                                  

   ENTITIES_SEARCH_FOR :=
      ARR_STRING ( '&Agrave;',
                   '&AGRAVE;',
                   '&agrave;',
                   '&Aacute;',
                   '&AACUTE;',
                   '&aacute;',
                   '&Egrave;',
                   '&EGRAVE;',
                   '&egrave;',
                   '&Eacute;',
                   '&EACUTE;',
                   '&eacute;',
                   '&Igrave;',
                   '&IGRAVE;',
                   '&igrave;',
                   '&Iacute;',
                   '&IACUTE;',
                   '&iacute;',
                   '&Ograve;',
                   '&OGRAVE;',
                   '&ograve;',
                   '&Oacute;',
                   '&OACUTE;',
                   '&oacute;',
                   '&Ugrave;',
                   '&UGRAVE;',
                   '&ugrave;',
                   '&Uacute;',
                   '&UACUTE;',
                   '&uacute;',
                   '&laquo;',
                   '&LAQUO;',
                   '&raquo;',
                   '&RAQUO;',
                   '&euro;',
                   '&EURO;',
                   '&deg;',
                   '&DEG;' );

   ENTITIES_REPLACE :=
      ARR_STRING ( 'À',
                   'À',
                   'à',
                   'Á',
                   'Á',
                   'á',
                   'È',
                   'È',
                   'è',
                   'É',
                   'É',
                   'é',
                   'Ì',
                   'Ì',
                   'ì',
                   'Í',
                   'Í',
                   'í',
                   'Ò',
                   'Ò',
                   'ò',
                   'Ó',
                   'Ó',
                   'ó',
                   'Ù',
                   'Ù',
                   'ù',
                   'Ú',
                   'Ú',
                   'ú',
                   '«',
                   '«',
                   '»',
                   '»',
                   '€',
                   '€',
                   '°',
                   '°' );

   OUT         := DIRTY;

   FOR CONT IN 1 .. 38
   LOOP
      OUT         :=
         REPLACE ( OUT,
                   ENTITIES_SEARCH_FOR ( CONT ),
                   ENTITIES_REPLACE ( CONT ) );
   END LOOP;

   RETURN (OUT);
END STRIP_HTML;

<强>选项2:

SELECT UTL_I18N.unescape_reference(COL1) COL1,
       UTL_I18N.unescape_reference(COL2) COL2,
       UTL_I18N.unescape_reference(COL3) COL3,
       UTL_I18N.unescape_reference(COL4) COL4
  FROM TEMP;

但是这不能处理所有大写的HTML友好代码。所以需要另外替换它。