Почему вы хотите заменить этих персонажей? Многие люди имеют проблемы с символами, такими как фигурные кавычки Microsoft, потому что эти символы не поддерживаются их набором символов базы данных, который, по умолчанию, заставляет преобразование набора символов заменять те символы заменой символов как '?'. Если это проблема, которую вы пытаетесь решить, код базы данных не может помочь, потому что преобразование набора символов происходит на сетевом уровне еще до того, как данные попадают в базу данных. Потенциально вы могли бы использовать Oracle Locale Builder для создания собственной локали для ваших клиентских компьютеров, которая позволяла бы вам указывать различные замещающие символы (то есть двойные кавычки, а не фигурные кавычки Microsoft).
Если ваша проблема не связана с набором символов, нет способа создать такой динамический триггер. Вы могли бы написать немного динамического SQL, который создавал бы триггер для каждой таблицы с именем REPLACE
в каждом столбце VARCHAR2
в таблице. Конечно, вам нужно будет поддерживать триггер каждый раз, когда добавляется дополнительный столбец VARCHAR2
(путем изменения триггера или повторного запуска блока PL / SQL).
Не проверено, и я уверен, что сгенерированный DDL не верен, но вы бы хотели что-то вроде
DECLARE
l_sql_stmt VARCHAR2(4000);
BEGIN
FOR tbl IN (SELECT * FROM user_tables)
LOOP
l_sql_stmt := 'CREATE OR REPLACE TRIGGER ' || tbl.table_name || '_changeChars ' ||
' BEFORE INSERT ON ' || tbl.table_name ||
' FOR EACH ROW ' ||
'BEGIN ';
FOR col IN (SELECT * FROM user_tab_cols WHERE table_name = tbl.table_name)
LOOP
l_sql_stmt := l_sql_stmt ||
' :new.' || col.column_name ||
' := replace( :new.' || col.column_name || ',''"'', ''"''');';
END LOOP;
l_sql_stmt := l_sql_stmt ||
'END; ';
dbms_output.put_line( 'SQL statement = ' || l_sql_stmt );
EXECUTE IMMEDIATE l_sql_stmt;
END LOOP;
END;