请假设我在Oracle表中有一个CLOB字段,其中存储了包/过程/函数的创建脚本。
我想删除每行末尾的所有空白 ,但是:
a)DBMS_LOB.TRIM(CLOB字段)是一个过程而不是一个函数; b)RTRIM(CLOB)不会失败,但无法实现这一目标。
如何解决我的问题?
请注意,每行开头的空格对于存储在CLOB字段中的PL / SQL源代码的缩进很有用,因此无法删除它们。
提前感谢您的帮助与合作。
答案 0 :(得分:3)
要删除每行末尾的空格,可以使用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
答案 1 :(得分:0)
如果最后一行末尾有空格,则尼克的解决方案会增加一行。
应该是
regexp_replace(col, '\s+('||CHR(10)||'|$)', '\1')
即使这样也可以去除任何空白行。
更好的解决方案,但只处理尾随空格和制表符
regexp_replace(col, '[ ' ||chr(9)|| ']+$', '', 1, 0, 'm')