2016-09-21 45 views
0

我們有一個名爲TEMPLATES的表格,它將html電子郵件模板存儲爲純文本。該表中有許多列,但我們關心的是TEMPLATE列,這是存儲文本的位置。在oracle中更新變量語法

我們最近更新了服務器使用的庫,在它們發送給用戶之前解析這些模板。這些庫使用變量

${varName} 

一種新的語法我的問題是很多的舊電子郵件模板使用舊的語法

@[email protected] 

這些變量名只包含字母數字字符。我正嘗試使用REGEXP_REPLACE將舊的@[email protected]語法的所有實例替換爲新的${whateverVariable}語法,但我在替換時難以保留變量名稱。這可能嗎?有一個更好的方法嗎?

我應該提到該列是一個CLOB,如果這有所作爲。

回答

1

CLOB在區別方面在於REGEXP_REPLACE會將模板截斷爲32k個字符 - 您的模板比那個長嗎?

無論如何,這裏有一個方法來做到這一點。請注意,如果事實上您的變量名稱可能包含非字母數字字符(如連字符),它將無法修改。

with 
    inputs (email_tmpl) as (
     select 'Dear @[email protected] @[email protected], ...whatever' from dual 
    ) 
select regexp_replace(email_tmpl, '@([[:alnum:]]+)@', '${\1}') as new_tmpl 
from inputs 
; 


NEW_TMPL 
----------------------------------- 
Dear ${mrmrs} ${fname}, ...whatever 

1 row selected. 
+0

這是有效的感謝,不知道我做錯了什麼。 –

+0

@LeeAbraham - 在你的文章中,你說過難以保存變量名。這就是'\ 1'的反向引用。它必須引用回SUBEXPRESSION - 用括號括起來的匹配模式的一部分。也許你沒有把它括在括號裏?或者,也許你在括號外加+(一個或多個字符)而不是內部? – mathguy