請假設我在Oracle表中有一個CLOB字段,其中存儲了程序包/過程/函數的創建腳本。Oracle PL/SQL中的RTRIM(CLOB字段)
我想在每一行的端部,以除去所有空格,但:
一個)DBMS_LOB.TRIM(CLOB field)是一個過程,而不是一個功能; b)RTRIM(CLOB)不會失敗,但不能實現這一點。
我該如何解決我的問題?
請注意,每行開頭的空格對於存儲在CLOB字段中的PL/SQL源代碼的縮進非常有用,因此它們不會被刪除。
預先感謝您的幫助和合作。
請假設我在Oracle表中有一個CLOB字段,其中存儲了程序包/過程/函數的創建腳本。Oracle PL/SQL中的RTRIM(CLOB字段)
我想在每一行的端部,以除去所有空格,但:
一個)DBMS_LOB.TRIM(CLOB field)是一個過程,而不是一個功能; b)RTRIM(CLOB)不會失敗,但不能實現這一點。
我該如何解決我的問題?
請注意,每行開頭的空格對於存儲在CLOB字段中的PL/SQL源代碼的縮進非常有用,因此它們不會被刪除。
預先感謝您的幫助和合作。
要在每一行結束時,你可以使用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
PL/SQL腳本存儲在CLOB字段中的時間非常長(大約50K行),所以這種解決方案 - 工作正常! - 效率低下,這意味着需要很長時間。您認爲這樣可以提供更高效的解決方案嗎? – UltraCommit
你有沒有考慮過打開文件,迭代每行,修剪尾隨空格並將CLOB寫回到表中? – haki
我寧願使用REGEXP_REPLACE方法。 CHR(10)之後的序列(您想要多少次)必須簡單地替換爲CHR(10)。我怎樣才能做到這一點? –
UltraCommit
從MY_TABLE中選擇REGEXP_REPLACE(MY_CLOB_FIELD,'\ s *'|| chr(10),chr(10));是完全不受歡迎的:( – UltraCommit