【问题标题】:RTRIM(CLOB field) in Oracle PL/SQLOracle PL/SQL 中的 RTRIM(CLOB 字段)
【发布时间】:2013-07-31 16:00:54
【问题描述】:

请假设我在 Oracle 表中有一个 CLOB 字段,其中存储了包/过程/函数的创建脚本。

我想删除每行末尾的所有空格,但是:

a) DBMS_LOB.TRIM(CLOB 字段)是一个过程而不是一个函数; b) RTRIM (CLOB) 不会失败,但无法实现这一目标。

我该如何解决我的问题?

请注意,每行开头的空格对于缩进存储在 CLOB 字段中的 PL/SQL 源代码很有用,因此无需删除。

提前感谢您的帮助和合作。

【问题讨论】:

  • 您是否考虑过打开文件,迭代每一行,修剪尾随空格并将 CLOB 写回表中?
  • 我更喜欢 REGEXP_REPLACE 方法。 CHR(10) 后面的序列 (你想要多少次)必须简单地替换为 CHR(10)。我怎样才能做到这一点?
  • 从 MY_TABLE 中选择 REGEXP_REPLACE (MY_CLOB_FIELD, '\s*'||chr(10), chr(10));完全没有效率:(
  • 您是要更新表格,还是只是删除选择时的空格?这张桌子有多大?
  • 这张表是PL/SQL包、过程和函数的备份表,所以它每天都在增长。每行包含两个 CLOB:审查前的包/过程/函数的 CLOB,审查后的包/过程/函数的 CLOB。每个 CLOB 最多可以达到 50K 行,大约 80 个字符。

标签: oracle clob


【解决方案1】:

要删除每行末尾的空格,您可以使用regexp_replace() 正则表达式函数:

regexp_replace(col, '\s+('||CHR(10)||'|$)', chr(10)) 

这是一个例子(注:replace 函数仅用于高亮空格):

with t1(col) as(
  select to_clob('begin  '||chr(10)||chr(32)||chr(32)||'something is going on here'||chr(32)||chr(32)||chr(10)|| 'end'||chr(32)||chr(32))
    from dual
)
select replace(col, ' ', '_') as with_spaces
     , replace(
               regexp_replace(col, '\s+('||CHR(10)||'|$)', chr(10))
               , ' '
               , '_'
               ) as without_spaces
  from t1

结果:

WITH_SPACES                           WITHOUT_SPACES
---------------------------------------------------------------------
begin__                               begin
__something_is_going_on_here__        __something_is_going_on_here
end__                                 end

【讨论】:

  • 存储在 CLOB 字段中的 PL/SQL 脚本非常长(大约 50K 行),所以这个解决方案 - 可以正常工作! - 效率低下,这意味着它需要很长时间。您认为是否存在更有效的解决方案?
【解决方案2】:

如果最后一行有任何尾随空格,那么尼克的解决方案会添加一个额外的行。
应该是

regexp_replace(col, '\s+('||CHR(10)||'|$)', '\1')

即便如此,这也会删除任何空白行。
这个解决方案更好,但它只处理尾随空格和制表符

regexp_replace(col, '[ ' ||chr(9)|| ']+$', '', 1, 0, 'm')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2011-02-07
    • 2014-03-31
    • 1970-01-01
    • 2021-12-09
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多