Oracle 触发器中,如果取一个包含空格VARCHAR2类型的字符串,空格后的内容取不到!需要用REPLACE(str,' ','')替换掉空格!
今天在写触发器判断一个Varchar2型字符串有没有更改的时候,取新值和旧值的时候,如果字符串中包含了空格,那么空格之后的内容将取不到,我也不知道到底是什么原因。但是这个时候,我需要记录这个字符串的内容,那么,现在我就只能使用REPLACE(str,' ','')来替换掉空格,才可以取到值。
- 表结构
DESCRIPTION VARCHAR2 1024 备注
- 触发器(有问题)
DECLARE
historyText TB_EXP_HISTORY.EH_HIS_TEXT%TYPE; /*记录日志的主要信息*/
BEGIN
if (:OLD.DESCRIPTION <> :NEW.DESCRIPTION) or ((:OLD.DESCRIPTION is not null) and (:NEW.DESCRIPTION is null) ) or ((:NEW.DESCRIPTION is not null) and (:OLD.DESCRIPTION is null) ) then /*备注*/
historyText:=concat(historyText,'备注:');
historyText:=concat(historyText,:OLD.DESCRIPTION);
historyText:=concat(historyText,'----->');
historyText:=concat(historyText,:NEW.DESCRIPTION);
historyText:=concat(historyText,';');
end if;
END;
如果按照上面的写法,那么记录到的日志会有个问题,假如我将DESCRIPTION=‘abc def’改为DESCRIPTION=‘abc d’,最后OLD.DESCRIPTION只能取到旧值中的空格之前的值“abc”,显然,只能过滤掉空格来获取完全的值。即完整的代码为:
- 触发器(没问题)
DECLARE
historyText TB_EXP_HISTORY.EH_HIS_TEXT%TYPE; /*记录日志的主要信息*/
BEGIN
if (:OLD.DESCRIPTION <> :NEW.DESCRIPTION) or ((:OLD.DESCRIPTION is not null) and (:NEW.DESCRIPTION is null) ) or ((:NEW.DESCRIPTION is not null) and (:OLD.DESCRIPTION is null) ) then /*备注*/
historyText:=concat(historyText,'备注:');
historyText:=concat(historyText,replace(:OLD.DESCRIPTION,' ',''));
historyText:=concat(historyText,'----->');
historyText:=concat(historyText,replace(:NEW.DESCRIPTION,' ',''));
historyText:=concat(historyText,';');
end if;
END;
也许,这个问题有其它更简单的方法可以解决,或许是我笨拙,不知道一些原理,但目前,就先这样吧!