2013-07-31 43 views
1

請假設我在Oracle表中有一個CLOB字段,其中存儲了程序包/過程/函數的創建腳本。Oracle PL/SQL中的RTRIM(CLOB字段)

我想在每一行的端部,以除去所有空格,但:

一個)DBMS_LOB.TRIM(CLOB field)是一個過程,而不是一個功能; b)RTRIM(CLOB)不會失敗,但不能實現這一點。

我該如何解決我的問題?

請注意,每行開頭的空格對於存儲在CLOB字段中的PL/SQL源代碼的縮進非常有用,因此它們不會被刪除。

預先感謝您的幫助和合作。

+0

你有沒有考慮過打開文件,迭代每行,修剪尾隨空格並將CLOB寫回到表中? – haki

+0

我寧願使用REGEXP_REPLACE方法。 CHR(10)之後的序列(您想要多少次)必須簡單地替換爲CHR(10)。我怎樣才能做到這一點? – UltraCommit

+0

從MY_TABLE中選擇REGEXP_REPLACE(MY_CLOB_FIELD,'\ s *'|| chr(10),chr(10));是完全不受歡迎的:( – UltraCommit

回答

2

要在每一行結束時,你可以使用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 
+0

PL/SQL腳本存儲在CLOB字段中的時間非常長(大約50K行),所以這種解決方案 - 工作正常! - 效率低下,這意味着需要很長時間。您認爲這樣可以提供更高效的解決方案嗎? – UltraCommit