Создание триггера в схеме Oracle для замены определенных символов - PullRequest
0 голосов
/ 11 сентября 2018

У меня проблемы с попаданием не-ASCII символов в мою базу данных из-за ввода пользователя.

Я хочу создать триггер в базе данных, чтобы при вставке / обновлении определенного символа он просто заменял его пробелом.

Это мой триггер (я добавлю несколько недопустимых символов):

CREATE OR REPLACE TRIGGER database.incidents_ascci_summary  
BEFORE INSERT OR UPDATE ON database.table
FOR EACH ROW
BEGIN
        if :new.column like '%'||chr(253)||'%' then
           :new.column := REPLACE( :new.column, ''%'||chr(253)||'%'', ' ' );
END if;
END;
/

chr (253) = ý

Который создает триггер. Тем не менее, когда я бегу

UPDATE table f
SET f.column = 'Hiýa' 
WHERE f.incidentid = 'INCIDENT#'

Я получаю это сообщение об ошибке от Oracle:

ORA-04098: триггер 'INCMAN.INCIDENTS_ASCCI_SUMMARY' недействителен и не прошел повторную проверку

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 11 сентября 2018

У вас есть проблема в:

:new.column := REPLACE( :new.column, ''%'||chr(253)||'%'', ' ' );

Должно быть:

:new.column := REPLACE( :new.column, chr(253), ' ' );

Кроме того, вам не нужно проверять перед использованием REPLACE, но вы можете просто сделать

BEGIN
        :new.column := REPLACE( :new.column, chr(253), ' ' );
END;

Если вам нужно обработать более одного символа, TRANSLATE может быть способом; например:

SELECT TRANSLATE('aaXbbYccZdd', 'XYZ', '   ') from dual

дает:

TRANSLATE('AAXBBYCCZDD','XYZ','')
---------------------------------
aa bb cc dd    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...