1)
dbms_sql_translater is just the "tip of the iceberg". SQL translation also includes a suite of *automatic* tranlsations, eg,
http://docs.oracle.com/database/121/DRDAA/sql_transl_install.htm#DRDAA29156 2) Yep...nice idea, and seems to work :-)
SQL> drop user demo cascade;
User dropped.
SQL> create user demo identified by demo quota 100m on users;
User created.
SQL> grant create session, alter session, create table, create sql translation profile, create procedure to DEMO;
Grant succeeded.
SQL>
SQL> conn demo/demo
Connected.
SQL> create table emp ( x varchar(10));
Table created.
SQL> exec dbms_errlog.create_error_log ( dml_table_name => 'EMP' );
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> exec DBMS_SQL_TRANSLATOR.DROP_PROFILE(profile_name => 'DEMO_PROFILE'); exception when others then null;
PL/SQL procedure successfully completed.
SQL>
SQL> exec dbms_sql_translator.create_profile('DEMO_PROFILE');
PL/SQL procedure successfully completed.
SQL>
SQL> BEGIN
2 DBMS_SQL_TRANSLATOR.REGISTER_SQL_TRANSLATION(
3 profile_name => 'DEMO_PROFILE',
4 sql_text => 'INSERT INTO EMP VALUES (''QBCDEFGHIJKKKKK'')', -- trailing space deliberate to align with PLSQL
5 translated_text => 'INSERT INTO EMP VALUES (''QBCDEFGHIJKKKKK'') LOG ERRORS INTO ERR$_EMP (TO_CHAR(SYSTIMESTAMP))');
6 END;
7 /
PL/SQL procedure successfully completed.
SQL>
SQL> conn system/admin
Connected.
SQL> alter system flush shared_pool;
System altered.
SQL> conn demo/demo
Connected.
SQL> INSERT INTO EMP VALUES ('QBCDEFGHIJKKKKK');
INSERT INTO EMP VALUES ('QBCDEFGHIJKKKKK')
*
ERROR at line 1:
ORA-12899: value too large for column "DEMO"."EMP"."X" (actual: 15, maximum: 10)
SQL> select count(*) from err$_emp;
COUNT(*)
----------
0
SQL>
SQL> alter session set sql_translation_profile = DEMO_PROFILE;
Session altered.
SQL> alter session set events = '10601 trace name context forever, level 32';
Session altered.
SQL>
SQL> INSERT INTO EMP VALUES ('QBCDEFGHIJKKKKK');
INSERT INTO EMP VALUES ('QBCDEFGHIJKKKKK')
*
ERROR at line 1:
ORA-12899: value too large for column "DEMO"."EMP"."X" (actual: 15, maximum: 10)
SQL> select count(*) from err$_emp;
COUNT(*)
----------
1
SQL>
SQL>