sql >> Base de Datos >  >> RDS >> Oracle

Actualizar con después de insertar el activador en la misma tabla

Si desea asignar un valor predeterminado simple, la forma más fácil es declararlo en la tabla, utilizando la cláusula DEFAULT.

SQL> create table t42
  2    ( col1 number default 1 not null
  3      , col2 date)
  4  /

Table created.

SQL> insert into t42 (col2) values (sysdate)
  2  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2
---------- ---------
         1 03-AUG-11

SQL>

Esto funciona con literales o pseudocolumnas como SYSDATE o USER. Si desea derivar un valor más complicado con una función definida por el usuario o una secuencia, deberá usar un disparador.

Aquí hay una nueva versión de la tabla...

SQL> create table t42
  2    ( col1 number default 1 not null
  3      , col2 date default sysdate
  4      , col3 varchar2(30) default user
  5      , col4 number )
  6  /

Table created.

SQL>

... con un disparador:

SQL> create or replace trigger t42_trg
  2      before insert or update
  3      on t42
  4      for each row
  5  begin
  6      if :new.col4 is null
  7      then
  8          :new.col4 := my_seq.nextval;
  9      end if;
 10  end;
 11  /

Trigger created.

SQL> insert into t42 (col1, col2, col3)
  2  values (99, sysdate, 'MR KNOX')
  3  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2      COL3                                 COL4
---------- --------- ------------------------------ ----------
        99 03-AUG-11 MR KNOX                               161

SQL>

Tenga en cuenta que aunque todas las columnas de la tabla son predeterminadas, tengo que completar al menos una columna para que el SQL sea válido:

SQL> insert into t42 values ()
  2  /
insert into t42 values ()
                        *
ERROR at line 1:
ORA-00936: missing expression


SQL>

Pero puedo pasar NULL a COL4 para obtener un registro completamente predeterminado:

SQL> insert into t42 (col4) values (null)
  2  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2      COL3                                 COL4
---------- --------- ------------------------------ ----------
        99 03-AUG-11 MR KNOX                               161
         1 03-AUG-11 APC                                   162

SQL>

Lector de advertencia:mi disparador usa la nueva sintaxis 11g. En versiones anteriores, teníamos que asignar el valor de la secuencia usando una instrucción SELECT:

select my_seq.nextval
into :new.col4
from dual;